这是我一直怀疑的事情。考虑以下代码段。
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 的调用是对其父类(super class)的检查方法;因为它不存在,调用从那个点移动到 B.check()。
- 有人可以解释一下或给我指点一份说明其内部工作原理的文档吗?我找不到任何东西。
- 有人可以用 C++/Java 向我展示类似的实现吗?我认为将它与其他语言进行比较会帮助我更好地理解手头的问题。
非常感谢。
最佳答案
该算法在 this excellent article 中进行了解释.
简而言之,
super(A,self)
在 self.__class__.__mro__
中查找 after A
的下一个类.
在你的例子中,self
是 c
,所以 self.__class__
是 C
。
C.__mro__
是 [C,A,B,object]
。因此 MRO 中 A
之后的下一个类恰好是 B
。
因此 super(A,self)
返回一个 super
对象,就属性查找而言,它的行为类似于 B
。
super(A, self).check()
调用 B.check()
。
The C3 algorithm用于生成 MRO(方法解析顺序)的 Python 在 this essay 中也有更详细的描述。作者:Michele Simionato。
关于java - Python 中的 OOP 范式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3175714/