Dej*_*jan 5 python super method-resolution-order python-3.x
我有这段代码,其中使用了超级继承和多重继承。班级成绩是:
go A go!
go C go!
go B go!
go D go!
虽然我期望:
go A go!
go B go!
go D go!
根据我的理解:D因为MRO调用了B类,因为go是在B中实现的。B类调用了它的父A的super。A被执行了,那就可以了。然后我期望 B 继续执行,所以这意味着 B 被执行,最后 D 被执行。但这当然是不正确的。为什么会进入C,因为go方法的定义是在B中找到的,那么它不应该再在C中搜索。这就是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!")
a = A()
b = B()
c = C()
d = D()
d.go()
当您调用 时d.go(),每次调用都会super使用调用实例的 MRO(在本例中,dMRO 为 D、B、C、A、对象。super不一定引用它静态出现的类的父级。
这在 的定义中最为明显B.go。尽管 的定义B一无所知C,但它的self参数是对类型对象的引用,而MROD中的下一个类是 is 、 not 。DBCA
| 归档时间: | 
 | 
| 查看次数: | 807 次 | 
| 最近记录: |