五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

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

發(fā)布日期:2022-01-02 21:41 | 文章來源:CSDN

我們知道,在面向?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í)候,并不會報(bào)錯(cuò),它會自動使用父類的 address 屬性。

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

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

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

但接下來就不對了, .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í)例。我們再來看有繼承的情況:

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 都會變成子類的實(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í)都會跑到子類里面去。 所有看起來是父類進(jìn)行的操作,其實(shí)都是子類在進(jìn)行 。上面的代碼,甚至可以近似等價(jià)于:

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

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

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部