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:如何使用它以及为什么使用它?