Python property()

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 的基本属性。
  • 如果未提供 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

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

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战