由于在深度学习的路上,发现自己两年前学习的python有些遗忘,在面向对象这一块尤其不熟悉,故刷一遍廖雪峰老师的官方教程,梳理一下遗漏的知识点。
参考网址:https://www.liaoxuefeng.com/wiki/1016959663602400
1.使用模块
if name==“main”:
test()
如果直接运行xxx.py文件,即主文件,则if通过,并运行test;
若import xxx as x,注意无.py标识,即引用文件,它不是主文件,if不通过,且不运行test()。
文件中加入了main判断语句,则该.py文件只能直接运行、或作为主文件调用其他无main的文件,无法被调用。
demo1:
' a test module '#任何模块代码的第一个字符串都被视为模块的文档注释
__author__ = 'Michael Liao'#使用__author__变量把作者写进去
import sys#导入sys模块后,我们就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能
def test():
args = sys.argv
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!')
if __name__=='__main__':
test()
#当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,
#if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码
out1:
Hello, world!
2.作用域
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。
正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;
类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量。
类似_xxx和__xxx(双下划线)这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;
demo2:
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:
外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
3.面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的**类(Class)**的概念。
面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念,而实例(Instance)则是一个个具体的Student,比如,Bart Simpson和Lisa Simpson是两个具体的Student。
所以,面向对象的设计思想是抽象出Class,根据Class创建Instance。
面向对象的抽象程度又比函数要高,因为一个Class既包含数据,又包含操作数据的方法。
数据封装、继承和多态是面向对象的三大特点。
demo2:(from 评论区大佬,帮助理解)
上帝
class 类 (人) instance 实例 (你,我,他) 你会有些属性(身高,年龄,体重) 你会有些技能(吃饭,泡妞)
init 方法的主要作用,就是初始化你的属性,这些属性,在上帝初始化你的时候就要赋予给你,比如zhangsan = Person(170,29,50)这时上帝就把你创造出来了,也就是实例化了你,然后,你到底有哪些技能呢,这就看有没有在类里面定义了,如果有定义泡妞的技能,那么你就可以调用泡妞的技能来泡妞,大致就是这样吧,看看下面的例子就更清楚了。
class Person(object):
# 这里就是初始化你将要创建的实例的属性
def __init__(self,hight,weight,age):
self.hight = hight
self.weight = weight
self.age = age
# 定义你将要创建的实例所有用的技能
def paoniu(self):
print('你拥有泡妞的技能')
def eat(self):
print('you can eat')
# 开始创建实例
zhangsan=Person(170,50,29)
lisi = Person(175,100,30)
# 你的实例开始使用它的技能
zhangsan.paoniu()
lisi.eat()
4.类和实例
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
demo3:
'''
class后面紧接着是类名,即Student,类名通常是大写开头的单词,
紧接着是(object),表示该类是从哪个类继承下来的.
通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。
通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去
'''
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
'''
到__init__方法的第一个参数永远是self,表示创建的实例本身,
因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身
'''
'''
有了__init__方法,在创建实例的时候,就不能传入空的参数了,
必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:
'''
bart = Student('Bart Simpson', 59)
print(bart.name, bart.score)
out3:
Bart Simpson 59
5.数据封装
既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法。
demo4:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):#定义了一个方法,第一个参数是self,其他与普通函数无异
print('%s: %s' % (self.name, self.score))
def get_grade(self):#封装的另一个好处是可以给Student类增加新的方法
if self