Python中的property特性屬性
阿新 • • 發佈:2019-10-03
在Java中,我們將物件欄位定義為private欄位,這樣在呼叫過程中不能直接呼叫物件欄位,需要通過setter/getter進行讀取/賦值,保障了資料的安全性。
在Python中,通過property,使得不再需要setter/getter進行private物件欄位的包裝。Python約定成俗的規定是在private欄位前新增“_”/“__”。
private欄位變為只讀欄位:
class TestClass:
def __init__(self, x):
self._x = x
這裡定義了一個TestClass類,它有一個例項欄位_x,定了使用者傳來的x值,_x是private欄位,通過object._x訪問private欄位不符合語言規範,進而我們要將_x變為property(特性),通過object.x來訪問。
class TestClass(object):
def __init__(self, x):
self._x = x
@property
def x(self):
return self._x
my = TestClass(20)
# 執行ok
print(my.x)
結果:
20
這裡能看到,對_x欄位進行了 property特性設定,進行只讀操作,如果要對_x欄位進行賦值該如何操作呢?
class TestClass(object): def __init__(self, x): self._x = x @property def x(self): return self._x # 賦值操作 @x.setter def x(self, value): self._x = value my = TestClass(20) # 執行ok print(my.x) my.x = 30 print(my.x) 結果: 20 30
我們通常使用內建的@property裝飾器。但其實property是一個類,python中類和函式的呼叫方式都差不多,他們都是可呼叫物件
property的構造方法如下:
class property(object):
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
""""""
它最大接受4個引數,都可以為空。
第一個為getter,第二個為setter,第三個為delete函式,第四個為文件。
上述程式碼另一種寫法
class TestClass:
def __init__(self, x):
self._x = x
def get_x(self):
return self._x
def set_x(self, value):
self._x = value
x = property(get_x, set_x)
>>> obj = TestClass(10)
>>> obj.x
10