欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中類的mro與繼承關(guān)系詳解(二)

 更新時間:2022年07月28日 08:48:38   作者:??宿者朽命???  
這篇文章主要介紹了Python中類的mro與繼承關(guān)系詳解,上一篇我們已經(jīng)通過mro相關(guān)資料介紹了mro繼承關(guān)系的基礎(chǔ)內(nèi)容,這片緊接著上一篇文章展開詳細內(nèi)容,需要的朋友可以參考一下

前言

版本:

  • windows 10.0
  • python 3.8

多重繼承

Python數(shù)字比較與類結(jié)構(gòu)中有簡略提到類,且在Python中類的mro與繼承關(guān)系詳解稍有解釋繼承關(guān)系,用到一個基類Animal如下:

class Animal:
    property_ = '能夠思考'

    def __init__(self, name, age, value):
        self.name_ = name
        self.age_ = age
        self.val_ = val

再定義Action活動作為另一個基類:

class Action:

    def __init__(self, action, val):
        self.action_ = action
        self.val_ = val
  • 現(xiàn)在需定義一個Dog類,不僅是動物,還能夠跑,可以來繼承上面兩個類來定義:
class Dog(Animal, Action):

    def __init__(self, name, age, action, val):
        Animal.__init__(self, name, age, val+1)
        Action.__init__(self, action, val)

dog = Dog('大福', 8, '跑', 78)
print(dog.__dict__)
# {'name_': '大福', 'age_': 8, 'val_': 78, 'action_': '跑'}

發(fā)現(xiàn)打印出的實例屬性,好像字典的鍵值更新,先初始化Animal時,val傳入的值為79,而后被更新為78,這里為什么不能像繼承單個類一樣直接用super方法代替呢。

上一篇有提到mro解析順序,可進行嘗試,不重寫__init__方法,發(fā)現(xiàn)Dog類只能傳入三個參數(shù),且都為Animal類的參數(shù),因為繼承的兩個父類都有該方法,優(yōu)先繼承左邊的父類方法,如果想都繼承可以考慮這樣的形式,然而會提高后續(xù)維護的困難性。

可以將最左邊的父類改成super方式:

class Dog(Animal, Action):

    def __init__(self, name, age, action, val):
        super().__init__(name, age, val+1)
        Action.__init__(self, action, val)

mro解析順序,與上面所述一致:

Dog.mro()
# [__main__.Dog, __main__.Animal, __main__.Action, object]
  • 祖孫類

如再進行繼承,視Dog為父類,其Animal,Action都為祖父類,定義一個Pet類:

class Pet(Dog):
    pass
pet = Pet('大福', 8, '跑', 78)

傳入?yún)?shù),和實例化的對象跟Dog一樣,如果需要改寫某個方法,可以參照之前的方法進行改寫,另外若在保留原方法的邏輯上進行補充則用super方法。

Pet類的mro:

Pet.mro()
# [__main__.Pet, __main__.Dog, __main__.Animal, __main__.Action, object]

思考片刻

通過上面的繼承及對應的mro解析順序,可以思考以下通過多重繼承類后,輸出的x屬性值為多少:

class Alpha:
    def __init__(self, val):
        self.x = val

class Beta(Alpha):
    pass

class Gamma:
    def __init__(self, val):
        self.x = val + 1
class Omega(Gamma):
    def __init__(self, val):
        super().__init__(val + 1)
class Kappa(Beta, Omega):
    pass
k = Kappa(1)
print(k.x)

如果腦內(nèi)沒有一個mro解析順序圖,這里準備了:

[__main__.Kappa, __main__.Beta, __main__.Alpha, __main__.Omega, __main__.Gamma, object]

這里或許會有疑問,Beta后面不是Omega嗎?怎么到Alpha了,可以先看下Omega,繼承Gamma,而GammaAlpha并不是同源的,類似于Dog類的繼承,那么優(yōu)先就會使用Alpha的__init__方法,所以在傳入?yún)?shù)值1的時候,僅運行了Alpha內(nèi)的self.x = val,屬性x被賦值成1,在最后print輸出即為1,打印結(jié)果檢查:

print(k.x)
# 1

若把Gamma類改成繼承Alpha類,再次猜測print(k.x)的值為多少?

class Alpha:
    def __init__(self, val):
        self.x = val

class Beta(Alpha):
    pass

class Gamma(Alpha):
    def __init__(self, val):
        self.x = val + 1

class Omega(Gamma):
    def __init__(self, val):
        super().__init__(val + 1)

class Kappa(Beta, Omega):
    pass

k = Kappa(1)
print(k.x)

查看mro解析順序:

[__main__.Kappa, __main__.Beta, __main__.Omega, __main__.Gamma, __main__.Alpha, object]

此時發(fā)現(xiàn)Alpha解析優(yōu)先級排在最后,BetaOmega可以看做是BetaGamma的優(yōu)先級比較,因為Omega繼承Gamma,且重寫了__init__方法,所以當傳入?yún)?shù)時會對Gamma類的屬性進行賦值,雖然Beta類直接繼承Alpha,但Gamma類也直接繼承,所以Alpha解析順序需要排在Gamma后面,從而當Kappa類傳入?yún)?shù)時,經(jīng)過Omega的super加1,傳入到Gamma處時為:self.x = val + 1中的val為2,輸出的k.x的值即為3,查看打印結(jié)果:

print(k.x)
# 3

總結(jié)

通過連續(xù)兩篇對類繼承及mro解析順序的說明,理解類在多重繼承中的變化,無論繼承多少遍,總歸要回歸本心,但也不能胡亂繼承,有條理的,有意義的繼承,才能讓自己乃至他人更好理解當下寫出的類。

到此這篇關(guān)于Python中類的mro與繼承關(guān)系詳解的文章就介紹到這了,更多相關(guān)Python mro內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python GUI庫圖形界面開發(fā)之PyQt5復選框控件QCheckBox詳細使用方法與實例

    python GUI庫圖形界面開發(fā)之PyQt5復選框控件QCheckBox詳細使用方法與實例

    這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5復選框控件QCheckBox詳細使用方法與實例,需要的朋友可以參考下
    2020-02-02
  • python3 shelve模塊的詳解

    python3 shelve模塊的詳解

    這篇文章主要介紹了python3 shelve模塊的詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Python中TK窗口的創(chuàng)建方式

    Python中TK窗口的創(chuàng)建方式

    這篇文章主要介紹了Python中TK窗口的創(chuàng)建方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • python判斷設備是否聯(lián)網(wǎng)的方法

    python判斷設備是否聯(lián)網(wǎng)的方法

    這篇文章主要為大家詳細介紹了python判斷設備是否聯(lián)網(wǎng)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python+Pygame實現(xiàn)海洋之神大冒險游戲

    Python+Pygame實現(xiàn)海洋之神大冒險游戲

    這篇文章主要介紹了如何利用Python+Pygame自制一個海洋之神大冒險游戲。規(guī)則是在海里收集魚骨頭,有些魚骨頭可以轉(zhuǎn)化為武器,用來攻擊敵人,感興趣的可以了解一下
    2022-08-08
  • python熱力圖實現(xiàn)的完整實例

    python熱力圖實現(xiàn)的完整實例

    熱力圖的使用場景有描述數(shù)據(jù)在空間的密集程度,常見有城市熱力圖、區(qū)域熱力圖,描述多個變量之間相關(guān)性高低程度,這篇文章主要給大家介紹了關(guān)于python熱力圖實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Python字符串str超詳細詳解(適合新手!)

    Python字符串str超詳細詳解(適合新手!)

    str函數(shù)是Python的內(nèi)置函數(shù),它將參數(shù)轉(zhuǎn)換成字符串類型,即人適合閱讀的形式,下面這篇文章主要給大家介紹了關(guān)于Python字符串str超詳細詳解的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Python實現(xiàn)備份文件實例

    Python實現(xiàn)備份文件實例

    這篇文章主要介紹了Python實現(xiàn)備份文件的方法,可實現(xiàn)針對各類常見擴展名的文件進行備份的功能,需要的朋友可以參考下
    2014-09-09
  • Python 實現(xiàn)自動化Excel報表的步驟

    Python 實現(xiàn)自動化Excel報表的步驟

    這篇文章主要介紹了Python 實現(xiàn)自動化Excel報表的步驟,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-04-04
  • pandas.DataFrame.iloc的具體使用詳解

    pandas.DataFrame.iloc的具體使用詳解

    本文主要介紹了pandas.DataFrame.iloc的具體使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06

最新評論