类的初始化方法
在写python代码时候,总能看到初始化__init__
的定义,但其实
初始化方法__init__
是可选。
class A:
def __init__(self, x):
self.x = x
可以看到类A
具有的属性有属性变量x
a = A(4)
a.x # 输出4
子类但初始化方法
如果子类没有新的构造参数,或者新的初始化逻辑,那么没有必要创建初始化__init__
方法。因为按照搜索顺序,解释器会找到基类的初始化方法并执行。
基于此,我们需要在子类的初始化方法中显式调用基类方法。
- 不显式调用
class A:
def __init__(self, x):
self.x = x
class B(A):
def __init__(self, x, y):
self.y = y
b = B(1, 2)
b.y # 输出2
b.x # 报错
当使用b.x
调用基类的初始化方法时候就报错:
---------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-628a1ebb8ea7> in <module>
----> 1 b.x
AttributeError: 'B' object has no attribute 'x'
可以看到此处是表明B类并没有属性x,这表明在B类初始化后,基类的初始化不被继承来,因此需要显式的调用, 使用super函数。
class C(A):
def __init__(self, x, y):
super().__init__(x) # 显式调用基类
self.y = y
c = C(1, 2)
c.x
c.y
注:
super() 函数是用于调用父类(超类)的一个方法。
super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
参考
- super()
- python 学习笔记