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

Python 多繼承中的一個(gè)詭異現(xiàn)象 既是 Father又是grandfather

 更新時(shí)間:2021年09月18日 11:01:17   作者:itskingname  
我們知道,在面向?qū)ο缶幊汤锩?,繼承是一個(gè)很重要的概念。子類可以使用父類的方法和屬性,接下來小編將用舉例的方式為大家講解Python 多繼承中的一個(gè)詭異現(xiàn)象 其即是爸爸又是爺爺?shù)钠孑猬F(xiàn)象,感興趣的小伙伴可以看下面文章具體了解

我們知道,在面向?qū)ο缶幊汤锩妫?繼承 是一個(gè)很重要的概念。子類可以使用父類的方法和屬性。

例如下面這段代碼:

class Father:
    def __init__(self):
        self.address = '上海'

    def say(self):
        print('我是爸爸')

class Son(Father):
    def __init__(self):
        super().__init__()

    def say(self):
        print('我是兒子')

son = Son()
print(son.address)

運(yùn)行效果如下圖所示:

從圖中可以看到,子類并沒有 self.address 這個(gè)屬性,但是當(dāng)我們直接打印的時(shí)候,并不會(huì)報(bào)錯(cuò),它會(huì)自動(dòng)使用父類的 address 屬性。

顯然,如果一個(gè)屬性,子類也沒有,父類也沒有,那肯定會(huì)報(bào)錯(cuò),如下圖所示:

我們也知道,Python 是支持多繼承的,一個(gè)子類可以有多個(gè)父類。那么,大家請(qǐng)看下面這段代碼:

class GrandFather:
    def __init__(self):
        self.address = '上海'

    def say(self):
        print('我是爸爸')

class Father:
    def __init__(self):
        self.age = 100
    
    def where(self):
        print('我現(xiàn)在住在:', self.address)

class Son(GrandFather, Father):
    def __init__(self):
        super().__init__()

    def say(self):
        print('我是兒子')

son = Son()
son.where()

運(yùn)行效果如下圖所示:

大家仔細(xì)觀察,會(huì)發(fā)現(xiàn)這段代碼有點(diǎn)奇怪。我調(diào)用的是 son.where() 方法,由于 Son 類沒有這個(gè)方法,于是它會(huì)去它的兩個(gè)父類里面找。于是在 Father 這個(gè)父類里面找到了。于是執(zhí)行 Father 里面的 where() 方法,目前為止沒有問題。

但接下來就不對(duì)了, .where() 方法里面,調(diào)用了 self.address 屬性??蓡栴}是 Father 這個(gè)類它并沒有 .address 屬性??!而且 Father 也沒有父類,那么這個(gè) .address 屬性是從哪里來的?

難道說,在開發(fā)者不知道的隱秘的角落里面, GrandFather 類悄悄成為了 Father 的父類?這樣一來, GrandFather 豈不是又是 C 的父類,又是 C 的父類的父類? GrandFather 既是爸爸又是爺爺?

實(shí)際上,并不存在這么混亂的關(guān)系。要解釋這個(gè)現(xiàn)象,我們就要從 self 這個(gè)東西說起。

我們知道,類的屬性都是以 self 開頭,方法的第一個(gè)參數(shù)也是 self 。那么這個(gè)  self 到底是什么東西?我們用一段小代碼來看看它是什么東西:

class A:
    def get_self(self):
        return self

test = A()
what_is_self = test.get_self()

test is what_is_self

運(yùn)行效果如下圖所示:

從圖里面可以看到, self 實(shí)際上就是這個(gè)類的實(shí)例。我們?cè)賮砜从欣^承的情況:

class A:
    def get_self(self):
        return self

class B(A):
    def __init__(self):
        ...

test = B()
what_is_self = test.get_self()

print(what_is_self)

從圖中可以看到,雖然我在 A 類的 .get_self() 方法中返回了 self ,但這個(gè) self 實(shí)際上是 B 類的實(shí)例。因?yàn)槲易允贾两K就只初始化了 B 類,并沒有初始化 A 類。A 雖然是 B 類的父類。但父類的  self 都會(huì)變成子類的實(shí)例。

明白這一點(diǎn)以后,前面的問題就很好解釋了,我們多打印一些信息:

大家注意畫紅線的地方, self 始終都是 Son 類的實(shí)例。所以,一開始初始化 .address 的時(shí)候,就是初始化的 Son 的實(shí)例的 .address 屬性。后面在 .where 里面調(diào)用 .address 的時(shí)候,也是讀取的 Son 的實(shí)例的 .address 屬性。所以,并不存在 Father 類去讀 GrandFather 類的情況。自始至終,都是 Son 類的實(shí)例在進(jìn)行各種操作。

所以,在這個(gè)例子里面,當(dāng)使用了繼承以后,所有父類的屬性和方法,子類如果有相同的名字,那么以子類的為準(zhǔn)。如果子類沒有定義,那么父類的屬性和方法,其實(shí)都會(huì)跑到子類里面去。 所有看起來是父類進(jìn)行的操作,其實(shí)都是子類在進(jìn)行 。上面的代碼,甚至可以近似等價(jià)于:

由于 say 方法在子類中有了定義,所以子類覆蓋父類。以子類的 say 方法為準(zhǔn)。 where address 由于子類沒有定義,所以 Father 類的 where 方法和 GrandFather 里面的 address 屬性,都會(huì)直接 跑 到子類里面。

到此這篇關(guān)于Python 多繼承中的一個(gè)詭異現(xiàn)象 既是 Father又是grandfather的文章就介紹到這了,更多相關(guān)Python 多繼承中的一個(gè)詭異現(xiàn)象 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyTorch變分自編碼器的構(gòu)建與應(yīng)用小結(jié)

    PyTorch變分自編碼器的構(gòu)建與應(yīng)用小結(jié)

    變分自編碼器是一種強(qiáng)大的深度學(xué)習(xí)模型,用于學(xué)習(xí)數(shù)據(jù)的潛在表示并能生成新的數(shù)據(jù)點(diǎn),使用PyTorch實(shí)現(xiàn)VAE不僅可以加深對(duì)生成模型的理解,還可以利用其靈活性進(jìn)行各種實(shí)驗(yàn),這篇文章主要介紹了PyTorch變分自編碼器的構(gòu)建與應(yīng)用,需要的朋友可以參考下
    2024-07-07
  • python里的單引號(hào)和雙引號(hào)的有什么作用

    python里的單引號(hào)和雙引號(hào)的有什么作用

    在本篇文章里小編給大家分享的是一篇關(guān)于python里的單引號(hào)和雙引號(hào)的作用的相關(guān)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • 利用python繪制CDF圖的示例代碼

    利用python繪制CDF圖的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用python實(shí)現(xiàn)繪制CDF圖,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08
  • Python制作進(jìn)度條的幾種方法

    Python制作進(jìn)度條的幾種方法

    如果你之前沒用過進(jìn)度條,八成是覺得它會(huì)增加不必要的復(fù)雜性或者很難維護(hù),其實(shí)不然。要加一個(gè)進(jìn)度條其實(shí)只需要幾行代碼,快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12
  • Linux添加Python?path方法及修改環(huán)境變量的三種方法

    Linux添加Python?path方法及修改環(huán)境變量的三種方法

    這篇文章主要介紹了Linux添加Python?path方法及修改環(huán)境變量的三種方法,Linux 下設(shè)置環(huán)境變量有三種方法,一種用于當(dāng)前終端,一種用于當(dāng)前用戶,一種用于所有用戶,本文對(duì)每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Python高斯消除矩陣

    Python高斯消除矩陣

    今天小編就為大家分享一篇關(guān)于Python高斯消除矩陣,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Python列表中多元素刪除(移除)的實(shí)現(xiàn)

    Python列表中多元素刪除(移除)的實(shí)現(xiàn)

    本文主要介紹了Python列表中多元素刪除(移除)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • pandas讀取中文xlsx文件出現(xiàn)的問題

    pandas讀取中文xlsx文件出現(xiàn)的問題

    這篇文章主要介紹了pandas讀取中文xlsx文件出現(xiàn)的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 使用Python自動(dòng)生成HTML的方法示例

    使用Python自動(dòng)生成HTML的方法示例

    這篇文章主要介紹了使用Python自動(dòng)生成HTML的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python 實(shí)現(xiàn)漢諾塔游戲

    python 實(shí)現(xiàn)漢諾塔游戲

    這篇文章主要介紹了python 實(shí)現(xiàn)漢諾塔游戲的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11

最新評(píng)論