python的property函數

python的builtin函數property其實很簡單,其實就像java中bean的概念一樣。可以控制類中變量的訪問規則,property()函數實現的原理應該就是幾天前寫的__getattr__,__getattribute__等等函數有關。
有人回想,爲什麼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這個名字,變量名和函數名重複的話會死循環的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章