大家好,我是大爆炸
在介绍@property前先介绍property()。
property()构造函数返回property属性。其语法是:
property(fget=None, fset=None, fdel=None, doc=None)
property()参数:
property()返回值:
property()从给定的getter、setter和deleter返回property属性。
示例1:使用getter、setter和deleter创建属性
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
结果:
Getting name
The name is: Adam
Setting name to John
Deleting name
这里,_name被用作私有变量,用于存储Person的名称。
我们还设置:
通过调用property()方法来设置一个新的属性name。
如程序所示,内部引用p.name调用get_name()作为getter, set_name()作为setter, del_name()作为deleter,通过方法内部的打印输出。
示例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()。
在定义getter、setter和deleter时,使用了相同的方法name()。现在,无论何时使用 p.name,它都会在内部调用相应的getter、setter和deleter。