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

Python中使用雙下劃線防止類屬性被覆蓋問題

 更新時間:2019年06月27日 14:27:33   投稿:mrr  
這篇文章主要介紹了Python中使用雙下劃線防止類屬性被覆蓋,需要的朋友可以參考下

在使用Python編寫面向?qū)ο蟮拇a時,我們會常常使用“繼承”這種開發(fā)方式。例如下面這一段代碼:

class Info:
  def __init__(self):
    pass
  def calc_age(self):
    print('我是父類的方法')
class PeopleInfo(Info):
  def __init__(self):
    super().__init__()
  def calc_age(self):
    print(123456)

如果你使用 PeopleInfo 初始化一個對象,然后調(diào)用這個類的 calc_age 方法,我們來看看運(yùn)行效果,如下圖所示:

 

可以看出,父類 Info 里面的 calc_age 被子類里面的 calc_age 給“覆蓋”了。

到目前為止,應(yīng)該都是你已經(jīng)知道的東西。那么下一個問題,請問 PeopleInfo 里面的 __init__ 會不會覆蓋 Info 里面的 __init__ ?

為了確認(rèn)這一點(diǎn),我們來測試一下:

class Info:
  def __init__(self):
    print('我是父類的__init__')
  def calc_age(self):
    print('我是父類的方法')
class PeopleInfo(Info):
  def __init__(self):
    super().__init__()
    print('我是之類的初始化方法')
  def calc_age(self):
    print(123456)

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

 

這里你發(fā)現(xiàn)父類和子類的 __init__ 都被運(yùn)行了。

不過你可能會強(qiáng)行解釋為:在子類的 __init__ 里面,有一行 super().__init__() ,這個地方可能子類還沒有完全覆蓋父類,所以先運(yùn)行了父類的方法。等到子類的 __init__ 全部執(zhí)行完成以后,才會覆蓋父類。

當(dāng)然,這種強(qiáng)行詭辯顯然是錯誤的,但為了證明這里你看到的現(xiàn)象和這個 super().__init__() 沒有任何關(guān)系,我們不使用 __init__ ,而是自己定義一個:

class Info:
  def __init__(self):
    pass
  def __calc_age(self):
    print('我是父類的方法')
  def run_father(self):
    self.__calc_age()
class PeopleInfo(Info):
  def __init__(self):
    super().__init__()
    pass
  def __calc_age(self):
    print(123456)
  def run_son(self):
    self.__calc_age()

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

 

從這里可以看出,父類和子類的 __calc_age 都成功運(yùn)行了。

這是因?yàn)?,在Python里面,類方法或者屬性如果以雙下劃線開頭,那么他們就是類的私有方法,在被繼承的時候,即使子類有相同名字的以雙下劃線開頭的屬性或者方法也不會覆蓋父類。

而且這些以雙下劃線開頭的私有方法或者屬性,在類內(nèi)部可以自由被其他方法調(diào)用,但是在實(shí)例對象里面是不能直接調(diào)用的,如下圖所示:

 

那么Python是如何實(shí)現(xiàn)這一點(diǎn)的呢?實(shí)際上Python僅僅是改了一個名字而已。我們使用 dir 函數(shù)看看實(shí)例對象 kingname 里面有哪些內(nèi)容,如下圖所示:

 

大家請注意方框框住的內(nèi)容,其中的 _Info__calc_age 就是父類中的 __calc_age ,而 _PeopleInfo__calc_age 就是子類中的 __calc_age 。Python僅僅是改了一個名字,在這種雙下劃線的私有方法或者私有屬性的前面加上了 _類名 ,這樣就確保了子類和父類的方法名不一致。

所以,雖然 在規(guī)范上,這種雙下劃線的私有方法和私有屬性是不應(yīng)該在外部訪問的 ,但是如果你想強(qiáng)行訪問,可以個使用這種改名以后的名字:

kingname = PeopleInfo()
kingname._PeopleInfo__calc_age() # 強(qiáng)行調(diào)用子類的私有方法
kingname._Info__calc_age() # 強(qiáng)行調(diào)用父類的私有方法

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

 

總結(jié)

以上所述是小編給大家介紹的Python中使用雙下劃線防止類屬性被覆蓋問題,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!

相關(guān)文章

  • Python中functools模塊函數(shù)解析

    Python中functools模塊函數(shù)解析

    這篇文章主要介紹了Python中functools模塊的常用函數(shù)解析,分別講解了functools.cmp_to_key,functools.total_ordering,functools.reduce,functools.partial,functools.update_wrapper和functools.wraps的用法,需要的朋友可以參考下
    2017-03-03
  • Python中operator模塊的操作符使用示例總結(jié)

    Python中operator模塊的操作符使用示例總結(jié)

    operator模塊中包含了Python的各種內(nèi)置操作符,諸如邏輯、比較、計(jì)算等,這里我們針對一些常用的操作符來作一個Python中operator模塊的操作符使用示例總結(jié):
    2016-06-06
  • jupyter notebook插入本地圖片的實(shí)現(xiàn)

    jupyter notebook插入本地圖片的實(shí)現(xiàn)

    這篇文章主要介紹了jupyter notebook插入本地圖片的實(shí)現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python利用 SVM 算法實(shí)現(xiàn)識別手寫數(shù)字

    Python利用 SVM 算法實(shí)現(xiàn)識別手寫數(shù)字

    支持向量機(jī) (Support Vector Machine, SVM) 是一種監(jiān)督學(xué)習(xí)技術(shù),它通過根據(jù)指定的類對訓(xùn)練數(shù)據(jù)進(jìn)行最佳分離,從而在高維空間中構(gòu)建一個或一組超平面。本文將介紹通過SVM算法實(shí)現(xiàn)手寫數(shù)字的識別,需要的可以了解一下
    2021-12-12
  • python閉包的實(shí)例詳解

    python閉包的實(shí)例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python閉包的實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-10-10
  • python內(nèi)建類型與標(biāo)準(zhǔn)類型

    python內(nèi)建類型與標(biāo)準(zhǔn)類型

    這篇文章主要介紹了python內(nèi)建類型與標(biāo)準(zhǔn)類型,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 用Python實(shí)現(xiàn)群發(fā)郵件

    用Python實(shí)現(xiàn)群發(fā)郵件

    大家好,本篇文章主要講的是用Python實(shí)現(xiàn)群發(fā)郵件,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • python httpx的具體使用

    python httpx的具體使用

    本文主要介紹了python httpx的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • python實(shí)現(xiàn)帶驗(yàn)證碼網(wǎng)站的自動登陸實(shí)現(xiàn)代碼

    python實(shí)現(xiàn)帶驗(yàn)證碼網(wǎng)站的自動登陸實(shí)現(xiàn)代碼

    本例所登錄的某網(wǎng)站需要提供用戶名,密碼和驗(yàn)證碼,在此使用了python的urllib2直接登錄網(wǎng)站并處理網(wǎng)站的Cookie
    2015-01-01
  • python 解決數(shù)據(jù)庫寫入時float自動變?yōu)檎麛?shù)的問題

    python 解決數(shù)據(jù)庫寫入時float自動變?yōu)檎麛?shù)的問題

    這篇文章主要介紹了python 解決數(shù)據(jù)庫寫入時float自動變?yōu)檎麛?shù)的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論