📜  Python property()

📅  最后修改于: 2020-09-20 13:38:36             🧑  作者: Mango

property()构造返回property属性。

property()的语法为:

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

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

property()参数

property()具有四个可选参数:

  1. fget(可选)-用于获取属性值的函数。默认为None
  2. fset(可选)-用于设置属性值的功能。默认为None
  3. fdel(可选)-删除属性值的功能。默认为None
  4. doc(可选)-一个字符串 ,其中包含该属性的文档(docstring)。默认为None

从property()返回值

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

  1. 如果未提供任何参数,则property()返回不包含任何getter,setter或deleter的基本属性属性。
  2. 如果未提供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的名称的私有变量。

我们还设置:

  1. 使用getter方法get_name()来获取人名,
  2. setter方法set_name()来设置人的名字,
  3. 一个删除器方法del_name()来删除人的名字。

现在,我们通过调用property()方法来设置新的属性name

如程序中所示,通过方法内部显示的打印输出,在内部引用p.name get_name()称为getter,将set_name()用作setter,将del_name()用作del_name()

示例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用于setter方法)和@name.deleter用于@name.deleter方法)来完成的。

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

现在,无论何时我们使用p.name ,它都会在内部调用适当的getter,setter和deleter,如方法内部显示的打印输出所示。