当前位置:  开发笔记 > 编程语言 > 正文

在python中为什么超级行为具有多重继承?

如何解决《在python中为什么超级行为具有多重继承?》经验,为你挑选了1个好方法。

所以我们在下面有一个代码片段.我不明白为什么它会这样.为什么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.



1> chepner..:

尽管它的名字,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.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有