gpt4 book ai didi

python - 在 python 中具有多重继承的 MRO

转载 作者:行者123 更新时间:2023-11-28 20:25:43 24 4
gpt4 key购买 nike

在关于 Python webpage 的文档中python 中经典类的方法解析顺序被描述为深度优先的从左到右搜索。我试图用这段代码对此进行测试:

class A(object):
def __init__(self):
print "Initialized A"

class B(A):
def test():
print "Initialized B"

class C(A):
def __init__(self):
print "Initialized C"

class D(B, C):
def __init__(self):
super(D, self).__init__()
print "Initialized D"

当我创建对象 D 的实例时:

D()

我得到结果:

Initialized C
Initialized D

虽然我期望打印“Initialized A”、“Initialized D”,因为 MRO 是深度优先的,但首先在 B 中搜索初始化,如果找不到(情况就是如此),它应该在层次结构中更深层次并且在 B(即 A)的基类中查找函数。谁能给我一个解释,为什么我得到的是 C 的初始化函数而不是 A 的初始化函数?

最佳答案

D 的 MRO 是:

print(D.mro())
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>]

所以

super(D, self).__init__()

D 之后的 self.__class__.mro() 中的第一个类中查找 __init__ 方法。由于 B 没有 __init__,它会在 C 中寻找 __init__ 方法。它找到 C.__init__,因此

super(D, self).__init__()

调用 C.__init__(self)

请注意 super 并未尝试访问 getattr(B, __init__)。相反,它正在 B.__dict__ 中寻找 '__init__'

关于python - 在 python 中具有多重继承的 MRO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14165923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com