下面是一段代码片段。我不明白为什么会这样。为什么super(B, self).go()
解析为C
类的go
方法?你知道吗
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!
尽管有它的名字,
super
并不一定是指超类。super(B, self)
是指self
的MRO中紧跟B
的类。你知道吗你可以看到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
的后代。你知道吗相关问题 更多 >
编程相关推荐