【发布时间】:2017-09-20 07:06:36
【问题描述】:
我有一个类似这样的程序:
class A():
def go(self):
print("A")
class B(A):
def go(self):
super().go()
print("B")
class C(A):
def go(self):
super().go()
print("C")
class D(A):
def go(self):
super().go()
print("D")
class E(B, C, D):
def go(self):
super().go()
print("E")
a = A()
b = B()
c = C()
d = D()
e = E()
print(e.go())
这是这个的输出:
A
D
C
B
E
None
我很好奇 super() 的工作流程,它是如何在 B 之前打印 D、C 的,为什么最后打印的是 None?详细解释将不胜感激。
【问题讨论】:
-
您是否阅读过这方面的众多现有资源?例如,stackoverflow.com/q/3277367/3001761。具体还有什么不明白的?
-
@cricket_007 因为它在 A 之后的 MRO 中的下一个,这就是为什么你把 mix-ins 放在实际的基类之前(参见例如stackoverflow.com/q/10018757/3001761)。
-
请参阅 Raymond Hettinger 的优秀博文,Super Considered Super,rhettinger.wordpress.com/2011/05/26/super-considered-super 和 PyCon 2015 的演讲:youtube.com/watch?v=EiOglTERPEo。您会看到 D、C、B 的顺序,因为这就是 Python 的方法解析顺序 (MRO) 的工作方式。
-
@jon 我错过了 init 没有定义,只有 e.go() 运行
-
我以为我了解
super的工作原理,然后这个问题来了,证明我错了。是时候避免super像瘟疫一样再次。
标签: python