白白白白丶白 发表于 2020-7-14 16:51:16

super函数

本帖最后由 白白白白丶白 于 2020-7-14 16:58 编辑

class A():
    def go(self):
      print ("go A go!")
    def stop(self):
      print ("stop A stop!")
    def pause(self):
      raise Exception("Not Implemented")
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!")
    def stop(self):
      super(C, self).stop()
      print ("stop C stop!")
class D(B,C):
    def go(self):
      super(D, self).go()
      print ("go D go!")
    def stop(self):
      super(D, self).stop()
      print ("stop D stop!")
    def pause(self):
      print ("wait D wait!")
class E(B,C):
    pass


>>> d = D()
>>> d.go()
go A go!
go C go!
go B go!
go D go!

这里中间顺序为什么要先执行C(A)的方法,再执行B(A)的方法,记得小甲鱼有个 视频讲过,请问在第几期哦

Twilight6 发表于 2020-7-14 17:10:20

本帖最后由 Twilight6 于 2020-7-14 17:11 编辑


顺序你可以看下下面的扩展阅读,这里涉及了 方法解析顺序(Method Resolution Order,MRO)和 C3 算法:

MRO 的顺序基本就是:在避免同一类被调用多次的前提下,使用广度优先和从左到右的原则去寻找需要的属性和方法。

在继承体系中,C3 算法确保同一个类只会被搜寻一次。例子中,如果一个属性或方法在 D 类中没有被找到,Python 就会搜寻 B 类,然后搜索 C类,如果都没有找到,会继续搜索 B 的基类 A,如果还是没有找到,则抛出“AttributeError”异常。

-------扩展阅读

视频:
零基础入门学习Python 继承

扩展阅读:
多重继承的陷阱:钻石继承(菱形继承)问题

sunrise085 发表于 2020-7-14 17:11:47

本帖最后由 sunrise085 于 2020-7-14 17:13 编辑

38课
不理解的话,可以看看我这个帖子的总结
Python细节之6、类的多继承中super函数的调用顺序
页: [1]
查看完整版本: super函数