【发布时间】:2019-09-26 05:08:38
【问题描述】:
我对 python OOP 比较陌生。 虽然我对 JAVA OOP 有一些经验,并且知道方法“super”的含义,但是当我有多重继承(JAVA 中不存在)时,我很难理解它在 python 中是如何工作的
在挖掘找到一些答案后,我根据继承图阅读到,python 为每个类制定了方法解析顺序 (MRO) 以确定查找实例方法的顺序。
我还读到 MRO 由“旧样式”或“新样式”决定,具体取决于我的 python 版本。 我有 python 3.7,所以我使用“新样式”方法。
如果我理解正确,每次我重写一个方法并调用“super”时,python 都会转到 MRO 中当前类之后出现的类中的方法。
确实,当我运行以下代码时:
class A(object):
def go(self):
print("go A go!")
class B(A):
def go(self):
super(B, self).go()
print("go B go!")
class C(A):
def go(self):
super(C, self).go()
print("go C go!")
class D(B,C):
def go(self):
super(D, self).go()
print("go D go!")
if __name__ == "__main__":
d = D()
d.go()
print(D.__mro__)
我得到了输出:
go A go!
go C go!
go B go!
go D go!
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
到目前为止一切顺利,但是当我尝试运行以下代码时:
class A(object):
def foo(self):
print('this is A')
class B(object):
def foo(self):
print('this is B')
class AB(A,B):
def foo(self):
super(AB,self).foo()
print('this is AB')
if __name__ == '__main__':
x = AB()
x.foo()
print(AB.__mro__)
我得到了输出:
this is A
this is AB
(<class '__main__.AB'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
而不是我预期的输出:
this is B
this is A
this is AB
(<class '__main__.AB'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
所以显然我不明白发生了什么......
对于这种情况的任何解释,以及关于 python 如何准确地确定 MRO(根据“新风格”)将不胜感激!
【问题讨论】:
-
我已经阅读了这个...没有找到我的问题的答案...
-
您是否查看了 Guido van Rossum 关于 MRO 的论文?:python-history.blogspot.com/2010/06/…
-
另请阅读Python's
super()considered super!。简短的回答:在协作继承层次结构中,恰好 one 类可以定义不调用super().foo()的foo。你有两个:A和B。一个类必须是“基础”,它将出现在从foo-providing 类继承的任何子类的 MRO 中。
标签: python python-3.x oop multiple-inheritance super