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

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

 更新時(shí)間:2021年09月18日 11:01:17   作者:itskingname  
我們知道,在面向?qū)ο缶幊汤锩?,繼承是一個(gè)很重要的概念。子類可以使用父類的方法和屬性,接下來(lái)小編將用舉例的方式為大家講解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)行效果如下圖所示:

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

顯然,如果一個(gè)屬性,子類也沒(méi)有,父類也沒(méi)有,那肯定會(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 類沒(méi)有這個(gè)方法,于是它會(huì)去它的兩個(gè)父類里面找。于是在 Father 這個(gè)父類里面找到了。于是執(zhí)行 Father 里面的 where() 方法,目前為止沒(méi)有問(wèn)題。

但接下來(lái)就不對(duì)了, .where() 方法里面,調(diào)用了 self.address 屬性。可問(wèn)題是 Father 這個(gè)類它并沒(méi)有 .address 屬性??!而且 Father 也沒(méi)有父類,那么這個(gè) .address 屬性是從哪里來(lái)的?

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

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

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

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è)賮?lái)看有繼承的情況:

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 類,并沒(méi)有初始化 A 類。A 雖然是 B 類的父類。但父類的  self 都會(huì)變成子類的實(shí)例。

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

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

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

由于 say 方法在子類中有了定義,所以子類覆蓋父類。以子類的 say 方法為準(zhǔn)。 where address 由于子類沒(méi)有定義,所以 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)度條的幾種方法

    如果你之前沒(méi)用過(guò)進(jìn)度條,八成是覺(jué)得它會(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高斯消除矩陣,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Python列表中多元素刪除(移除)的實(shí)現(xiàn)

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

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

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

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

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

    這篇文章主要介紹了使用Python自動(dòng)生成HTML的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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)論