我正在运行 Python 2.5,所以这个问题可能不适用于 Python 3。当您使用多重继承创建菱形类层次结构并创建派生类的对象时,Python 会做正确的事情 (TM)。它调用派生类的构造函数,然后是从左到右列出的父类,然后是祖父类。我熟悉 Python 的MRO;那不是我的问题。我很好奇从 super 返回的对象实际上如何以正确的顺序与父类中的 super 调用进行通信。考虑这个示例代码:
#!/usr/bin/python
class A(object):
def __init__(self): print "A init"
class B(A):
def __init__(self):
print "B init"
super(B, self).__init__()
class C(A):
def __init__(self):
print "C init"
super(C, self).__init__()
class D(B, C):
def __init__(self):
print "D init"
super(D, self).__init__()
x = D()
代码做直观的事情,它打印:
D init
B init
C init
A init
但是,如果您在 B 的 init 函数中注释掉对 super 的调用,则不会调用 A 和 C 的 init 函数。这意味着 B 对 super 的调用以某种方式知道 C 在整个类层次结构中的存在。我知道 super 返回一个带有重载 get 运算符的代理对象,但是 D 的 init 定义中 super 返回的对象如何将 C 的存在传达给 B 的 init 定义中 super 返回的对象?后续调用 super 使用的信息是否存储在对象本身上?如果是这样,为什么不是 super 而不是 self.super?
编辑:Jekke 非常正确地指出它不是 self.super 因为 super 是类的属性,而不是类的实例。从概念上讲这是有道理的,但实际上 super 也不是类的属性!您可以在解释器中通过创建两个类 A 和 B(其中 B 继承自 A)并调用dir(B)
. 它没有super
或__super__
属性。