有人回想,爲什麼python要控制變量的訪問?難道實現不了private和protected麼?變量命名是用兩條下劃線不能使變量private麼?
很遺憾,不可以。兩條下劃線只是起到規範的作用,可能會報警,但是如果你願意的話,還是可以無礙訪問的。而且隨着python版本變化搞不好以後這招還有可能不靈。所以我們需要property函數
class Propt(object):
def __init__(self):
self.__a2 = 'a2'
self._a1 = 'a1'
self.a = 'a'
self._field1 = 'field1'
@property
def field1(self):
print("field1 got")
return self._field1
@field1.setter
def field1(self, val):
print("field1 set")
self._field1 = val
p = Propt()
print(p.field1)
p.field1 = 'a'
輸出結果是:
field1 got
field1
field1 set
真的是非常簡單,如果你把函數field加上@property,那麼_field1就是隻讀的,除非你再加上field1.setter。
有個小疑問是,變量名可不可以改成其它的?比如說abcdefg,而保持函數名不變?嗯,這是沒問題的,只不過千萬不要改成field這個名字,變量名和函數名重複的話會死循環的。