博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python多重继承
阅读量:2190 次
发布时间:2019-05-02

本文共 1414 字,大约阅读时间需要 4 分钟。

多重繼承時,需要明確的是,當你多重繼承父類時,調用父類對應方法的關系。總結起來是,經典類中,使用深度優先,從左至右進行搜索;新式類中,它首先查找同胞兄弟,采用一種廣度優先的方式。
class P1: #(object): # parent class 1  
    def foo(self): 
        print 'called P1-foo()' 
 
class P2: #(object): # parent class 2 
    def foo(self): 
        print 'called P2-foo()' 
    def bar(self): 
        print 'called P2-bar()' 
 
class C1(P1, P2): # child 1 derived from P1, P2 
    pass 
 
class C2(P1, P2): # child 2 derived from P1, P2 
    def bar(self): 
        print 'called C2-bar()' 
 
class GC(C1, C2): # define grandchild class 
    pass # derived from C1 and C2 

下面這張圖描述了父類,子類及子孫類的關系圖,還有它們各自定義的方法:

首先來使用經典類:

>>> gc = GC()  
>>> gc.foo() # GC ==> C1 ==> P1 
called P1-foo() 
>>> gc.bar() # GC ==> C1 ==> P1 ==> P2 
called P2-bar() 

當調用foo()時,它首先在當前類(GC)中查找。如果沒找到,就向上查找最親的父類,C1。查找未遂,就繼續沿樹上訪到父類P1,foo()被找到。同样,對bar()來說,它通過搜索GC,C1,P1 然後在P2 中找到。因为使用這種解釋順序的緣故,C2.bar()根本就不會被搜索了。

取消類P1 和類P2 聲明中的對(object)的注釋,即使用新式類:

>>> gc = GC()  
>>> gc.foo() # GC ==> C1 ==> C2 ==> P1 
called P1-foo() 
>>> gc.bar() # GC ==> C1 ==> C2 
called C2-bar() 

與沿着繼承樹一步一步上溯不同,它首先查找同胞兄弟,采用一種廣度優先的方式。當查找foo(),它檢查GC,然後是C1 和C2,然後在P1 中找到。如果P1 中沒有,查找將會到達P2。當查找bar(),它搜索GC 和C1,緊接着在C2 中找到了。這样,就不會再繼續搜索到祖父P1 和P2。

新式類也有一個__mro__屬性,告訴你查找順序是怎样的:

>>> GC.__mro__
(<class '__main__.GC'>, <class '__main__.C1'>, <class
'__main__.C2'>, <class '__main__.P1'>, <class
'__main__.P2'>, <type 'object'>)

转载地址:http://spfub.baihongyu.com/

你可能感兴趣的文章
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
win10将IE11兼容ie10
查看>>
checkbox设置字体颜色
查看>>
第一篇 HelloWorld.java重新学起
查看>>
ORACLE表空间扩张
查看>>
orcal 循环执行sql
查看>>
web.xml配置监听器,加载数据库信息配置文件ServletContextListener
查看>>
结构型模式之桥接模式(Bridge)
查看>>
行为型模式之状态模式(State)
查看>>
行为型模式之策略模式(Strategy)
查看>>
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>
C语言字符、字符串操作偏僻函数总结
查看>>