最近在学习使用python,也做了一些项目,还是觉得要记录一下,避免很多坑趟过之后就忘记了
一,python类继承
- 方法调用
class Foo:
def f1(self):
print('Foo.f1')
def f2(self): #self=obj
print('Foo.f2') #在父类中找到发 f2属性,第3步打印这一行
self.f1() #obj.f1() 第4步再去掉用self的f1属性
class Bar(Foo):
def f1(self):#第五步, 在回到object自身的名称空间找f1属性,找到后调用
print('Bar.f1') #第6步 执行
obj=Bar() #第一步 :类的实例化, 先得到一个空对象,
obj.f2() #第2步:空对象调用f2属性 在自身寻找f2属性, 没有找到就去父类中寻找<br><br>#结果
# 打印结果
Foo.f2
Bar.f1
# 理解重点:self代表的是实例,故先从自身查找,没有找到才会找父类,所以打印的是Bar的f1
- super
super是用来手动调用父类的,python3中更是简化了写法:super().xx(self)即可
class A:
def add(self, x):
y = x+1
print(y)
class B(A):
def add(self, x):
super().add(x)
b = B()
b.add(2) # 3
坑点:如果在子类的init()中使用super().xx(self)需要注意,谨慎起见,需先调用super().init(),如果在其他方法中则可直接使用(比如在pyqt5,UI编程的时候,必须先调用super().init(),初始化UI组件)
继承中的_ init _
当在Python中出现继承的情况时,一定要注意初始化函数init的行为:
- 如果子类没有定义自己的初始化函数,父类的初始化函数会被默认调用;但是如果要实例化子类的对象,则只能传入父类的初始化函数对应的参数,否则会出错。
- 如果子类定义了自己的初始化函数,而在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化
- 如果子类定义了自己的初始化函数,在子类中显示调用父类,子类和父类的属性都会被初始化
二,默认参数的坑
在Python类中,不要使用引用类型,作为参数的默认值;
原因:当类函数调用未传参,默认参数初始化的时候,默认参数是一个类变量,实例变量仅仅是类变量的引用。造成实例之间数据错乱。
~ ~~~~~~ 待续 ~~~~~~ ~