这是我一直怀疑的事情。请考虑以下代码段。
class A(object):
def check(self):
super(A, self).check()
print "inside a"
class B(object):
def check(self):
print "inside b"
class C(A, B):
pass
c = C()
c.setup()
现在这给出了输出
inside b
inside a
通过pdb传递这个我看到在到达A.setup()时,正在调用B.setup()。但是,来自A的调用是对其超类的检查方法;因为它不存在,所以调用从那一点移动到B.check()。
非常感谢。
答案 0 :(得分:9)
该算法在this excellent article中解释。
简而言之,
super(A,self)
在self.__class__.__mro__
中查找 A
之后的下一个课程。
在您的情况下,self
为c
,因此self.__class__
为C
。
C.__mro__
是[C,A,B,object]
。因此A
恰好是B
之后MRO中的下一个课程。
所以super(A,self)
返回一个super
对象,就属性查找而言,其行为与B
相同。
super(A, self).check()
因此调用B.check()
。
The C3 algorithm Python用于生成MRO(方法解析顺序)也在Michele Simionato的this essay中进行了更详细的描述。