Python中super()的运作机制:
super()的定义:
def super(cls, instance):
mro = inst.__class__.mro()
return mro[mro.index(cls) + 1]
mro(Method resolution order)是python在多继承类中查找目标函数的策略,其采用的是广度优先算法,可通过类的mro方法查看。如下方代码:
class Base():
def __init__(self):
print("this is base init")
class A(Base):
def __init__(self):
print("this is A init")
super().__init__()
class B(Base):
def __init__(self):
print("this is B init")
super().__init__()
class C(A,B):
def __init__(self):
print("this is C init")
super(B, self).__init__()
print(C.mro())
c = C()
# 输出:
# [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
# this is C init
# this is base init
python根据mro顺序查找目标函数,而super则能实现“插队”效果,上述代码中,首先执行C的构造函数,输出“this is C init”,然后super(B, self)查找B类在C的mro中的位置,并返回它下一个位置的类(super()
函数返回的是mro[mro.index(cls) + 1]
),也就是Base类,之后执行Base的构造函数,输出“this is base”。
在python3中,super()会自动填充当前类和实例,使用super(Class_name, self).__init__()
和直接使用super().__init__()
的效果是一样的。