所以我们在下面有一个代码片段.我不明白为什么它会这样.为什么super(B, self).go()
解析为类的go
方法C
?
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!") d = D() d.go() # go A go! # go C go! # go B go! # go D go!
chepner.. 5
尽管它的名字,super
但不一定是指超类.super(B, self)
是指self
随后的MRO中的类B
.
你可以看到D的MRO
>>> D.__mro__ (, , , , )
这意味着,从d.go
,super(D, self)
指B
.当B.go
作为结果被调用时,super(B, self)
指的是C
,而不是 A
.这是因为self
它仍然是一个实例D
,所以它D.__mro__
决定了接下来要调用的内容,而不是静态超类B
.
要记住的最重要的事情super
是,在内部Foo.go
,你不知道哪个类super(Foo, self)
会引用,因为你不知道它self
是一个实例Foo
还是一个后代Foo
.
尽管它的名字,super
但不一定是指超类.super(B, self)
是指self
随后的MRO中的类B
.
你可以看到D的MRO
>>> D.__mro__ (, , , , )
这意味着,从d.go
,super(D, self)
指B
.当B.go
作为结果被调用时,super(B, self)
指的是C
,而不是 A
.这是因为self
它仍然是一个实例D
,所以它D.__mro__
决定了接下来要调用的内容,而不是静态超类B
.
要记住的最重要的事情super
是,在内部Foo.go
,你不知道哪个类super(Foo, self)
会引用,因为你不知道它self
是一个实例Foo
还是一个后代Foo
.