这是我一直怀疑的事情.请考虑以下代码段.
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().
>有人可以解释或指向一个文件,解释这是如何在内部工作的?我找不到任何东西.
>有人可以在C / Java中向我展示类似的实现吗?我认为将它与其他语言进行比较可以帮助我更好地理解手头的问题.
非常感谢.
解决方法
该算法在
this excellent article中解释.
简而言之,
super(A,self)在自我.__ class __.__ mro__中查看A之后的下一课.
在你的情况下,自我是c,所以自我.__ class__是C.
C .__ mro__是[C,A,B,object].所以A之后的MRO中的下一个类恰好是B.
因此,就属性查找而言,super(A,self)返回一个行为类似于B的超级对象.
super(A,self).check()因此调用B.check().
0700由Michele Simionato在this essay中更详细地描述了用于生成MRO(方法解析顺序)的The C3 algorithm.