Python中使用雙下劃線防止類屬性被覆蓋問題
在使用Python編寫面向對象的代碼時,我們會常常使用“繼承”這種開發(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 初始化一個對象,然后調用這個類的 calc_age 方法,我們來看看運行效果,如下圖所示:
可以看出,父類 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)
運行效果如下圖所示:
這里你發(fā)現父類和子類的 __init__ 都被運行了。
不過你可能會強行解釋為:在子類的 __init__ 里面,有一行 super().__init__() ,這個地方可能子類還沒有完全覆蓋父類,所以先運行了父類的方法。等到子類的 __init__ 全部執(zhí)行完成以后,才會覆蓋父類。
當然,這種強行詭辯顯然是錯誤的,但為了證明這里你看到的現象和這個 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()
運行效果如下圖所示:
從這里可以看出,父類和子類的 __calc_age 都成功運行了。
這是因為,在Python里面,類方法或者屬性如果以雙下劃線開頭,那么他們就是類的私有方法,在被繼承的時候,即使子類有相同名字的以雙下劃線開頭的屬性或者方法也不會覆蓋父類。
而且這些以雙下劃線開頭的私有方法或者屬性,在類內部可以自由被其他方法調用,但是在實例對象里面是不能直接調用的,如下圖所示:
那么Python是如何實現這一點的呢?實際上Python僅僅是改了一個名字而已。我們使用 dir 函數看看實例對象 kingname 里面有哪些內容,如下圖所示:
大家請注意方框框住的內容,其中的 _Info__calc_age 就是父類中的 __calc_age ,而 _PeopleInfo__calc_age 就是子類中的 __calc_age 。Python僅僅是改了一個名字,在這種雙下劃線的私有方法或者私有屬性的前面加上了 _類名 ,這樣就確保了子類和父類的方法名不一致。
所以,雖然 在規(guī)范上,這種雙下劃線的私有方法和私有屬性是不應該在外部訪問的 ,但是如果你想強行訪問,可以個使用這種改名以后的名字:
kingname = PeopleInfo() kingname._PeopleInfo__calc_age() # 強行調用子類的私有方法 kingname._Info__calc_age() # 強行調用父類的私有方法
運行效果如下圖所示:
總結
以上所述是小編給大家介紹的Python中使用雙下劃線防止類屬性被覆蓋問題,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
相關文章
Python tkinter之Bind(綁定事件)的使用示例
這篇文章主要介紹了Python tkinter之Bind(綁定事件)的使用詳解,幫助大家更好的理解和學習python的gui開發(fā),感興趣的朋友可以了解下2021-02-02
pybaobabdt庫基于python的決策樹隨機森林可視化工具使用
這篇文章主要為大家介紹了pybaobabdt庫基于python的決策樹隨機森林可視化工具使用探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-02-02

