最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

例如下面這段代碼:

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)行效果如下圖所示:

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

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

我們也知道,Python 是支持多繼承的,一個(gè)子類(lèi)可以有多個(gè)父類(lèi)。那么,大家請(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 類(lèi)沒(méi)有這個(gè)方法,于是它會(huì)去它的兩個(gè)父類(lèi)里面找。于是在 Father 這個(gè)父類(lèi)里面找到了。于是執(zhí)行 Father 里面的 where() 方法,目前為止沒(méi)有問(wèn)題。

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

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

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

我們知道,類(lèi)的屬性都是以 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è)類(lèi)的實(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 類(lèi)的 .get_self() 方法中返回了 self ,但這個(gè) self 實(shí)際上是 B 類(lèi)的實(shí)例。因?yàn)槲易允贾两K就只初始化了 B 類(lèi),并沒(méi)有初始化 A 類(lèi)。A 雖然是 B 類(lèi)的父類(lèi)。但父類(lèi)的  self 都會(huì)變成子類(lèi)的實(shí)例。

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

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

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

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

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

相關(guān)文章

  • opencv python 對(duì)指針儀表讀數(shù)識(shí)別的兩種方式

    opencv python 對(duì)指針儀表讀數(shù)識(shí)別的兩種方式

    這篇文章主要介紹了opencv python 對(duì)指針儀表讀數(shù)識(shí)別的兩種方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • python使用請(qǐng)求頭部headers處理403錯(cuò)誤

    python使用請(qǐng)求頭部headers處理403錯(cuò)誤

    有時(shí)候請(qǐng)求一個(gè)網(wǎng)頁(yè)的時(shí)候,無(wú)論是GET請(qǐng)求還是POST請(qǐng)求都訪問(wèn)不了,并出現(xiàn)403錯(cuò)誤,這是因?yàn)檫@些網(wǎng)頁(yè)為了防止惡意采集信息,使用了反爬機(jī)制,本文給大家介紹了python如何使用請(qǐng)求頭部headers處理403錯(cuò)誤,需要的朋友可以參考下
    2024-03-03
  • 基于python定位棋子位置及識(shí)別棋子顏色

    基于python定位棋子位置及識(shí)別棋子顏色

    本文主要介紹了python定位棋子位置及識(shí)別棋子顏色,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Python內(nèi)置函數(shù)locals()的具體示例

    Python內(nèi)置函數(shù)locals()的具體示例

    本文主要介紹了Python中的內(nèi)置函數(shù)locals()的具體用法和應(yīng)用場(chǎng)景,locals()函數(shù)用于獲取當(dāng)前局部符號(hào)表的字典,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • python學(xué)習(xí)之whl文件解釋與安裝詳解

    python學(xué)習(xí)之whl文件解釋與安裝詳解

    whl格式本質(zhì)上是一個(gè)壓縮包,里面包含了py文件,以及經(jīng)過(guò)編譯的pyd文件,下面這篇文章主要給大家介紹了關(guān)于python學(xué)習(xí)之whl文件解釋與安裝的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • numpy中np.sort返回索引的具體使用

    numpy中np.sort返回索引的具體使用

    本文主要介紹了使用numpy中np.sort函數(shù)返回索引的詳細(xì)解釋和使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Python列表list解析操作示例【整數(shù)操作、字符操作、矩陣操作】

    Python列表list解析操作示例【整數(shù)操作、字符操作、矩陣操作】

    這篇文章主要介紹了Python列表list解析操作,結(jié)合實(shí)例形式分析了Python列表針對(duì)整數(shù)、字符及矩陣的解析操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • Pandas數(shù)據(jù)分析的一些常用小技巧

    Pandas數(shù)據(jù)分析的一些常用小技巧

    這篇文章主要介紹了Pandas數(shù)據(jù)分析的一些常用小技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python變量的作用域是什么

    python變量的作用域是什么

    在本篇內(nèi)容里小編給大家分享了關(guān)于python變量的作用域的實(shí)例及用法,有興趣的朋友們可以學(xué)習(xí)下。
    2020-05-05
  • Spark處理數(shù)據(jù)排序問(wèn)題如何避免OOM

    Spark處理數(shù)據(jù)排序問(wèn)題如何避免OOM

    這篇文章主要介紹了Spark處理數(shù)據(jù)排序問(wèn)題如何避免OOM,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評(píng)論

平定县| 景谷| 白水县| 中卫市| 鹿邑县| 阿拉善右旗| 洪泽县| 杨浦区| 南木林县| 郑州市| 绩溪县| 广平县| 大足县| 高阳县| 霸州市| 来凤县| 郁南县| 威宁| 商洛市| 阿尔山市| 永泰县| 万州区| 特克斯县| 淅川县| 蓬安县| 绥化市| 天全县| 台中县| 湖口县| 临高县| 盐池县| 泗阳县| 蒙自县| 综艺| 稷山县| 拜泉县| 诸暨市| 龙江县| 清徐县| 怀柔区| 晋州市|