zoukankan      html  css  js  c++  java
  • python中的多继承

    python和C++一样,支持多继承。概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照何种顺序去到父类寻找呢,尤其是众多父类中有多个都包含该同名属性。

    1. class P1 #(object): 
    2.    def foo(self):           
    3.        print 'p1-foo' 
    4.  
    5. class P2 #(object): 
    6.    def foo(self): 
    7.        print 'p2-foo' 
    8.    def bar(self): 
    9.        print 'p2-bar' 
    10.  
    11. class C1 (P1,P2): 
    12.    pass  
    13.  
    14. class C2 (P1,P2): 
    15.    def bar(self): 
    16.        print 'C2-bar'   
    17.  
    18. class D(C1,C2): 
    19.    pass 
    20.   

    对经典类和新式类来说,属性的查找顺序是不同的。现在我们分别看一下经典类和新式类两种不同的表现

    1、经典类

    1. d=D() 
    2. d.foo() # 输出 p1-foo 
    3. d.bar() # 输出 p2-bar 

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

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

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

    2、新式类

    使用新式类要去掉第一段代码中的注释

    1. d=D() 
    2. d.foo() # 输出 p1-foo 
    3. d.bar() # 输出 c2-bar 

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

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

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

  • 相关阅读:
    haproxy 2.5 发布
    cube.js sql 支持简单说明
    基于graalvm 开发一个cube.js jdbc driver 的思路
    apache kyuubi Frontend 支持mysql 协议
    oceanbase 资源池删除说明
    基于obd 的oceanbase 扩容说明
    jfilter一个方便的spring rest 响应过滤扩展
    cube.js schema 定义多datasource 说明
    typescript 编写自定义定义文件
    meow 辅助开发cli 应用的工具
  • 原文地址:https://www.cnblogs.com/linyawen/p/2469538.html
Copyright © 2011-2022 走看看