欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python--多继承

程序员文章站 2022-07-15 16:58:59
...
 class F:
     def func(self):
         print('F')


 class A(F):
      def func(self):
          print('A')
     pass

  
 class B(A):
      def func(self):
              print('B')
         pass
    

 class E(F):
     def func(self):
         print('F')


 class C(E):
      def func(self):
          print('C')
     pass


 class D(B, C):
      def func(self):
          print('D')
     pass


 d = D()
 d.func()

以上问题,简化如下

			     ^          F  5
			     |        /   \
#深度优先	     |     2 A      E  4
			     |      |      |
			     |     1 B      C  3
			     |        \    /
			     |           D
			      —————————————————————————> 广度优先

在多继承中 从左到右继承, 如果B找不到,就会找A,如果A也找不到,则会找C,C找不到就会找E,E再找不到才是F

钻石继承 广度优先 Python3的新式类都是广度优先
在Python2中 经典类 深度优先
super的本质

 print(D.mro())

多继承当中,我们子类的对象调用一个方法,默认就是就近原则
经典类中 深度优先
新式类 广度优先
Python2.7 新式类和经典类共存,新式类要继承object
Python3 只有新式类 默认继承object
经典类 和新式类还有一个区别 mro 方法只在新式类中存在
super 只在Python3中存在

class A(object):
def func(self):
print(‘A’)

class B(A):
    def func(self):
        super().func()
        print('B')


class C(A):
    def func(self):
        super().func()
        print('C')


class D(B, C):
    def func(self):
        super().func()
        print('D')


d = D()
d.func()
         
          A
        /   \
       B     C
        \   /
          D
答案: A C B D

*****super的本质 : 不是直接 找父类 而是根据调用者的节点位置的广度优先顺序来的