python 之 多继承的顺序

xiaoxiao2021-02-28  37

python 支持多继承,但对与经典类和新式类来说,多继承查找的顺序是不一样的。  经典类:新式类  class P1:      def foo(self):                    print 'p1-foo'  class P2 :      def foo(self):          print 'p2-foo'      def bar(self):          print 'p2-bar'  class C1 (P1,P2):      pass   class C2 (P1,P2):      def bar(self):          print 'C2-bar'    class D(C1,C2):      pass class P1(object):      def foo(self):                    print 'p1-foo'  class P2(object):     def foo(self):          print 'p2-foo'      def bar(self):          print 'p2-bar'  class C1 (P1,P2):      pass   class C2 (P1,P2):      def bar(self):          print 'C2-bar'    class D(C1,C2):      pass  1. 经典类     d = D()     d.foo()  # 输出 p1-foo      d.bar()  # 输出 p2-bar 

实例d调用foo()时,搜索顺序是 D => C1 => P1

实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2

换句话说,经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。

2. 新式类     d=D()      d.foo()  # 输出 p1-foo      d.bar()  # 输出 c2-bar 

实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1

实例d调用bar()时,搜索顺序是 D => C1 => C2

可以看出,新式类的搜索方式是采用“广度优先”的方式去查找属性。

转载请注明原文地址: https://www.6miu.com/read-2626543.html

最新回复(0)