跳到主要内容

Python property() 函数

property() 函数的语法是:

property(fget=None, fset=None, fdel=None, doc=None)

推荐阅读:Python @property: 如何使用以及为什么使用?

property() 参数

property() 函数接受四个可选参数:

  • fget (可选) - 用于获取属性值的函数。默认为 None
  • fset (可选) - 用于设置属性值的函数。默认为 None
  • fdel (可选) - 用于删除属性值的函数。默认为 None
  • doc (可选) - 包含属性文档(docstring)的字符串。默认为 None

从 property() 返回的值

property() 从给定的 getter、setter 和 deleter 返回属性。

  • 如果没有给出参数,property() 返回一个不包含任何 getter、setter 或 deleter 的基础属性。
  • 如果没有提供 docproperty() 会使用 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

# 设置属性以使用 get_name, set_name
# 和 del_name 方法
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 装饰器

可以使用 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 来实现的,如程序所示。

接下来,我们使用属性 name 来指定 setter 和 deleter。

这是通过在 setter 方法前使用 @name.setter,在 deleter 方法前使用 @name.deleter 来实现的。

注意,我们使用了相同的方法 name(),但定义不同,用于定义 getter、setter 和 deleter。

现在,每当我们使用 p.name,它会在内部调用适当的 getter、setter 和 deleter,如方法中的打印输出所示。