1. 程式人生 > >【20181020】Python中沒有完全的私有屬性嗎?

【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的靈活讓強型別語言的開發者覺得不習慣,不過我倒覺得這正是其魅力所在。