python中的多重繼承實(shí)例講解
python和C++一樣,支持多繼承。概念雖然容易,但是困難的工作是如果子類調(diào)用一個(gè)自身沒(méi)有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個(gè)都包含該同名屬性。
對(duì)經(jīng)典類和新式類來(lái)說(shuō),屬性的查找順序是不同的?,F(xiàn)在我們分別看一下經(jīng)典類和新式類兩種不同的表現(xiàn):
經(jīng)典類:
#! /usr/bin/python
# -*- coding:utf-8 -*-
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
if __name__ =='__main__':
d=D()
d.foo()
d.bar()
執(zhí)行的結(jié)果:
p1-foo
p2-bar
將代碼實(shí)例,畫了一個(gè)圖,方便理解:

從上面經(jīng)典類的輸出結(jié)果來(lái)看,
實(shí)例d調(diào)用foo()時(shí),搜索順序是 D => C1 => P1,
實(shí)例d調(diào)用bar()時(shí),搜索順序是 D => C1 => P1 => P2
總結(jié):經(jīng)典類的搜索方式是按照“從左至右,深度優(yōu)先”的方式去查找屬性。d先查找自身是否有foo方法,沒(méi)有則查找最近的父類C1里是否有該方法,如果沒(méi)有則繼續(xù)向上查找,直到在P1中找到該方法,查找結(jié)束。
新式類:
#! /usr/bin/python
# -*- coding:utf-8 -*-
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
if __name__ =='__main__':
print D.__mro__ #只有新式類有__mro__屬性,告訴查找順序是怎樣的
d=D()
d.foo()
d.bar()
執(zhí)行的結(jié)果:
(<class '__main__.D'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.P1'>, <class '__main__.P2'>, <type 'object'>)
p1-foo
C2-bar
從上面新式類的輸出結(jié)果來(lái)看,
實(shí)例d調(diào)用foo()時(shí),搜索順序是 D => C1 => C2 => P1
實(shí)例d調(diào)用bar()時(shí),搜索順序是 D => C1 => C2
總結(jié):新式類的搜索方式是采用“廣度優(yōu)先”的方式去查找屬性。
- Python類的多重繼承問(wèn)題深入分析
- Python 的類、繼承和多態(tài)詳解
- 淺析Python中的多重繼承
- 在python里面運(yùn)用多繼承方法詳解
- Python 多線程其他屬性以及繼承Thread類詳解
- Python多重繼承的方法解析執(zhí)行順序?qū)嵗治?/a>
- Python中的單繼承與多繼承實(shí)例分析
- python多重繼承實(shí)例
- Python類的繼承與多態(tài)詳細(xì)介紹
- Python面向?qū)ο缶幊讨^承與多態(tài)詳解
- Python實(shí)現(xiàn)帶參數(shù)與不帶參數(shù)的多重繼承示例
- Python中多層繼承的實(shí)現(xiàn)示例
相關(guān)文章
Python StringIO及BytesIO包使用方法解析
這篇文章主要介紹了Python StringIO及BytesIO包使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Pytest實(shí)現(xiàn)setup和teardown的詳細(xì)使用詳解
這篇文章主要介紹了Pytest實(shí)現(xiàn)setup和teardown的詳細(xì)使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
詳解django使用include無(wú)法跳轉(zhuǎn)的解決方法
這篇文章主要介紹了詳解django使用include無(wú)法跳轉(zhuǎn)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
基于Python實(shí)現(xiàn)簡(jiǎn)單的定時(shí)器詳解
所謂定時(shí)器,是指間隔特定時(shí)間執(zhí)行特定任務(wù)的機(jī)制。幾乎所有的編程語(yǔ)言,都有定時(shí)器的實(shí)現(xiàn)。這篇文章主要介紹的是通過(guò)Python實(shí)現(xiàn)的定時(shí)器,感興趣的可以跟隨小編學(xué)習(xí)一下2021-12-12
如何用python?GUI(tkinter)寫一個(gè)鬧鈴小程序(思路詳解)
這篇文章主要介紹了用python?GUI(tkinter)寫一個(gè)鬧鈴小程序思路詳解,涉及到tkinter一些函數(shù)控件,數(shù)據(jù)的類的封裝,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
python numpy中對(duì)ndarry按照index增刪改查
這篇文章主要介紹了python numpy中對(duì)ndarry按照index增刪改查,在numpy中的ndarry是一個(gè)數(shù)組,因此index就是位置下標(biāo),注意下標(biāo)是從0開(kāi)始,接下來(lái)一起進(jìn)入下面文章了解詳細(xì)內(nèi)容吧2022-02-02
Python開(kāi)發(fā)之快速搭建自動(dòng)回復(fù)微信公眾號(hào)功能
這篇文章主要介紹了Python開(kāi)發(fā)之快速搭建自動(dòng)回復(fù)微信公眾號(hào)功能的相關(guān)資料,需要的朋友可以參考下2016-04-04

