【20181020】Python中沒有完全的私有屬性嗎?
今天別人問了我一個很有意思的問題,為什麼他看似能設定私有屬性,關於Python內有沒有真正的私有屬性。我的答案是有,又沒有。
為什麼看似可以設定私有屬性,這個問題很有意思,用一段程式碼表示
class BB():
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
b = BB('bb')
d = BB('dd')
b.__name = 'cc'
print(b.__name)
print(b.get_name())
print(d.get_name())
print(d.__name)
四個列印的執行結果依次是
cc
bb
dd
丟擲一個錯誤
b.__name = ‘cc’
對方疑惑的點在這裡,那麼通過print(b.get_name())列印的結果可以指定,這個b.__name = ‘cc’ 其實並不是修改了私有屬性,只是定義了例項物件b的一個新的變數名,變數名以下劃線dunder開頭。
print(b.__name)
print(b.get_name())
列印這兩個可以看出,私有屬性並沒有被修改,print(d.get_name()),print(d.__name)之後也可得知,之前那個變數只是單個例項物件b的屬性。並沒有在d中反饋出來。
類和物件確實很微妙,總之要多理解。
那麼為什麼又說python沒有真正的私有屬性呢?
因為雖然剛剛的例子驗證了不能訪問,但其實通過【例項物件._類物件__私有屬性】,比如b._BB__name是可以直接訪問私有屬性的。
python中唯一不變的是變化,就連號稱不可變的型別的tuple,也不乏有方法可以改變它。
Python的靈活讓強型別語言的開發者覺得不習慣,不過我倒覺得這正是其魅力所在。