Python中super()的运作机制

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__()的效果是一样的。

posted @ 2023-09-27 18:36  dingyang  阅读(14)  评论(0编辑  收藏  举报