zoukankan      html  css  js  c++  java
  • [python,2018-03-06] python中的继承顺序

    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里是否有该方法,如果没有则继续向上查找,直到在祖先类中找到该方法,查找结束。

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

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

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

    可以看出,新式类的搜索方式“广度优先”。

    参考:

    http://www.cnblogs.com/linyawen/archive/2012/04/25/2469538.html

  • 相关阅读:
    基于Antlr4编写DSL
    【整理】ANTLR应用案例 | 在路上
    【整理】ANTLR应用案例 | 在路上
    The ANTLR Parser Generator
    ANTLR4权威参考手册
    ANTLR Examples
    ANTLRWorks: The ANTLR GUI Development Environment
    http://www.cnblogs.com/vowei/archive/2012/08/24/2654287.html
    写一个编译器
    写一个编译器
  • 原文地址:https://www.cnblogs.com/shijt/p/8514663.html
Copyright © 2011-2022 走看看