亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1738 0

在使用Python編寫面向對象的代碼時,我們會常常使用“繼承”這種開發方式。例如下面這一段代碼:

            
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 初始化一個對象,然后調用這個類的 calc_age 方法,我們來看看運行效果,如下圖所示:

Python中使用雙下劃線防止類屬性被覆蓋問題_第1張圖片 ?

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

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

為了確認這一點,我們來測試一下:

            
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)
          

運行效果如下圖所示:

Python中使用雙下劃線防止類屬性被覆蓋問題_第2張圖片 ?

這里你發現父類和子類的 __init__ 都被運行了。

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

當然,這種強行詭辯顯然是錯誤的,但為了證明這里你看到的現象和這個 super().__init__() 沒有任何關系,我們不使用 __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()
          

運行效果如下圖所示:

Python中使用雙下劃線防止類屬性被覆蓋問題_第3張圖片 ?

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

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

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

Python中使用雙下劃線防止類屬性被覆蓋問題_第4張圖片 ?

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

Python中使用雙下劃線防止類屬性被覆蓋問題_第5張圖片 ?

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

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

            
kingname = PeopleInfo()
kingname._PeopleInfo__calc_age() # 強行調用子類的私有方法
kingname._Info__calc_age() # 強行調用父類的私有方法
          

運行效果如下圖所示:

Python中使用雙下劃線防止類屬性被覆蓋問題_第6張圖片 ?

總結

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产成人九九综合 | 亚洲国产精品专区 | 在线观看久草视频 | 亚洲一级成人 | 中文字幕视频在线播放 | 一级片影院 | 91视频这里只有精品 | 99这里只精品热在线获取 | 色天使久久综合网天天 | 久久久国产精品网站 | 四虎影视国产884a精品亚洲 | 男人边吃奶边爱边做视频日韩 | 国内精品福利在线视频 | 久久精品亚洲乱码伦伦中文 | 成人爱爱爱欧美日本视频 | 在线观看欧美视频 | 老司机午夜精品视频在线观看免费 | 成人精品国产亚洲欧洲 | 欧美乱大交xxxxx另类 | 欧美日韩国产精品 | 亚洲成精品动漫久久精久 | 日本欧美视频在线 | 狠狠色噜噜狠狠狠狠97影音先锋 | 中文国产成人精品久久96 | 亚洲成人一级 | 日本精品视频一视频高清 | 九九九精品 | 日韩精品成人免费观看 | 久久久国产精品va麻豆 | 亚洲免费中文字幕 | 国产资源在线播放 | 国产欧美日韩综合二区三区 | 欧美一级特黄特黄毛片 | 欧美一区中文字幕 | 色天使久久综合网天天 | 一级毛片免费的 | www国产精品 | 99热这里只有精品9 99热这里只有精品99 | 国产尤物 | 免费一级毛片无毒不卡 | 另类尿喷潮videofree |