大家好,我是大爆炸
在介紹@property前先介紹property()。
property()構(gòu)造函數(shù)返回property屬性。其語法是:
property(fget=None, fset=None, fdel=None, doc=None)
property()參數(shù):
- fget (optional) - 用于獲取屬性值,默認(rèn)為None。
- fset (optional) - 用于設(shè)置屬性值,默認(rèn)為None。
- fdel (optional) - 用于刪除屬性值。默認(rèn)為None。
- doc (optional) - 包含該屬性的文檔(docstring)的字符串。默認(rèn)為None。
property()返回值:
property()從給定的getter、setter和deleter返回property屬性。
- 如果沒有給出參數(shù),property()返回一個不包含任何getter、setter或deleter的基屬性屬性。
- 如果沒有提供doc,property()接受getter函數(shù)的文檔字符串。
示例1:使用getter、setter和deleter創(chuàng)建屬性
class Person:
def __init__(self, name):
self._name = name
def get_name(self):
print('Getting name')
return self._name
def set_name(self, value):
print('Setting name to ' + value)
self._name = value
def del_name(self):
print('Deleting name')
del self._name
# Set property to use get_name, set_name
# and del_name methods
name = property(get_name, set_name, del_name, 'Name property')
p = Person('Adam')
print(p.name)
p.name = 'John'
del p.name
結(jié)果:
Getting name
The name is: Adam
Setting name to John
Deleting name
這里,_name被用作私有變量,用于存儲Person的名稱。
我們還設(shè)置:
- getter方法get_name()來獲取人員的姓名,
- setter方法set_name()來設(shè)置人員的姓名,
- deleter方法del_name()來刪除人員的姓名。
通過調(diào)用property()方法來設(shè)置一個新的屬性name。
如程序所示,內(nèi)部引用p.name調(diào)用get_name()作為getter, set_name()作為setter, del_name()作為deleter,通過方法內(nèi)部的打印輸出。
示例2:使用@property裝飾器
可以使用Python/ target=_blank class=infotextkey>Python裝飾器@property來分配getter、setter和deleter,而不是使用property()。
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
print('Getting name')
return self._name
@name.setter
def name(self, value):
print('Setting name to ' + value)
self._name = value
@name.deleter
def name(self):
print('Deleting name')
del self._name
p = Person('Adam')
print('The name is:', p.name)
p.name = 'John'
del p.name
輸出:
Getting name
The name is: Adam
Setting name to John
Deleting name
這里使用了@property裝飾器,而不是property()。
- 首先,指定name()方法也是Person的一個屬性。這是通過在getter方法之前使用@property來實(shí)現(xiàn)的。
- 接下來,使用屬性名來指定setter和deleter。這是通過使用@name完成的。@name.setter用于setter方法,@name.deleter用于deleter方法。
在定義getter、setter和deleter時,使用了相同的方法name()。現(xiàn)在,無論何時使用 p.name,它都會在內(nèi)部調(diào)用相應(yīng)的getter、setter和deleter。