Jas*_*ack 2 python multiple-inheritance method-resolution-order
在Python 网页上的文档中,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"
Run Code Online (Sandbox Code Playgroud)
当我创建对象 D 的实例时:
D()
Run Code Online (Sandbox Code Playgroud)
我得到结果:
Initialized C
Initialized D
Run Code Online (Sandbox Code Playgroud)
虽然我期望打印“初始化 A”、“初始化 D”,因为 MRO 是深度优先的,但首先在 B 中搜索初始化,如果找不到(就是这种情况),它应该在层次结构中更深入并查找B(即A)的基类中的函数。有人能解释一下为什么我得到 C 的 init 函数而不是 A 的那个吗?
MROD为:
print(D.mro())
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>]
Run Code Online (Sandbox Code Playgroud)
所以
super(D, self).__init__()
Run Code Online (Sandbox Code Playgroud)
__init__在self.__class__.mro()after的第一个类中查找方法D。由于B没有__init__,它然后在 中查找__init__方法C。它发现C.__init__,因此
super(D, self).__init__()
Run Code Online (Sandbox Code Playgroud)
调用C.__init__(self)。
请注意,这super不是尝试访问getattr(B, __init__). 相反,它正在寻找'__init__'in B.__dict__。
| 归档时间: |
|
| 查看次数: |
833 次 |
| 最近记录: |