property() 的语法是
property(fget=None, fset=None, fdel=None, doc=None)
property() 参数
property() 接受四个可选参数
- fget (可选) - 用于获取属性值的函数。默认为
None。 - fset (可选) - 用于设置属性值的函数。默认为
None。 - fdel (可选) - 用于删除属性值的函数。默认为
None。 - doc (可选) - 包含属性文档(docstring)的字符串。默认为
None。
property() 的返回值
property() 从给定的 getter、setter 和 deleter 返回属性。
- 如果没有给出任何参数,
property()返回一个不包含任何 getter、setter 或 deleter 的基本属性。 - 如果未提供 doc,
property()将使用 getter 函数的 docstring。
示例 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 姓名的私有变量。
我们还设置了
- 一个 getter 方法
get_name()来获取人的姓名, - 一个 setter 方法
set_name()来设置人的姓名, - 一个 deleter 方法
del_name()来删除人的姓名。
现在,我们通过调用 property() 方法设置一个新的属性 name。
如程序所示,引用 p.name 会在内部调用 get_name() 作为 getter,set_name() 作为 setter,del_name() 作为 deleter,这通过方法中打印的输出来显示。
示例 2:使用 @property 装饰器
除了使用 property(),您还可以使用 Python 装饰器 @property 来分配 getter、setter 和 deleter。
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 完成的,如程序所示。
接下来,我们使用属性名来指定 setter 和 deleter。
这是通过对 setter 方法使用 @name.setter,对 deleter 方法使用 @name.deleter 完成的。
请注意,我们使用了相同的 name() 方法,但定义不同,来定义 getter、setter 和 deleter。
现在,每当我们使用 p.name 时,它都会在内部调用适当的 getter、setter 和 deleter,这通过方法中打印的输出来显示。
要了解更多关于 Python @property 的信息,请访问 Python @property:如何使用它以及为什么使用它?
