Python 中的属性装饰器

Manav Narula 2023年1月30日
  1. Python 中的属性
  2. 在 Python 中使用 @property 装饰器
Python 中的属性装饰器

我们可以在 Python 中创建我们的类并定义不同的数据成员和函数。一切都是对象,我们可以实例化我们自己定义的类的对象。

本教程将演示如何使用 Python 属性装饰器 (@property)。

Python 中的属性

有时,我们使用 Python 的 getter 和 setter 函数来返回非公共类属性。

我们在类中创建一个返回此属性的函数,即 getter 函数。

可以设置此类属性值的函数称为 setter 函数。

例子:

class A:
    def __init__(self, a):
        self._a = a

    def getter_a(self):
        return self._a

    def setter_a(self, val):
        self._a = val


n = A(5)
print(n.getter_a())
n.setter_a(10)
print(n.getter_a())

输出:

5
10

在上面的例子中,我们创建了 getter 和 setter 函数来返回和改变 a 的属性值。

这种方法不被认为是处理属性的 Pythonic 方式。我们可以消除使用 getter 和 setter 方法对类进行集群的需要。

Python 方法涉及使用可以为给定类属性建立功能的属性。

使用 property() 函数,我们创建 property 类的对象。我们将 getter、setter 和 deleter 方法附加为数据成员的属性。

为此,我们在属性函数中使用 fgetfsetfdeldoc 参数。

fget 关联的函数将返回属性的值。类似地,fset 方法将改变属性的值,而 fdel 函数删除该值。

doc 方法提供给定属性的文档。

我们将在下面的代码中使用这些。

class A:
    def __init__(self, a):
        self._a = a

    def get_a(self):
        return self._a

    def set_a(self, val):
        self._a = val

    def del_a(self):
        del self._a
        print("Deleted")

    a = property(fget=get_a, fset=set_a, fdel=del_a, doc="Documenttion for a")


n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)

输出:

5
10
Deleted
Traceback (most recent call last):
  File "<string>", line 21, in <module>
File "<string>", line 6, in get_a
AttributeError: 'A' object has no attribute '_a'

在上面的示例中,我们为类创建了属性 a 并添加了必要的属性。如你所见,在使用 deleted 属性后,我们会得到 AttributeError,表示该属性已被删除。

在 Python 中使用 @property 装饰器

装饰器在 Python 中用于向函数添加附加功能。将一个函数作为参数,并返回另一个函数。

在 Python 中引入装饰器之后,使用 property() 函数来设置属性的情况逐渐减少,而装饰器语法则更受青睐。

装饰器是在 Python v2.4 中引入的。 @property 装饰器开始流行用于创建属性。

我们将在下面的上一个示例中使用@property 装饰器。

class A:
    def __init__(self, a):
        self._a = a

    @property
    def a(self):
        return self._a

    @a.setter
    def a(self, val):
        self._a = val

    @a.deleter
    def a(self):
        del self._a
        print("Deleted")


n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)

输出:

5
10
Deleted
Traceback (most recent call last):
  File "<string>", line 23, in <module>
File "<string>", line 7, in a
AttributeError: 'A' object has no attribute '_a'

如你所见,我们得到了与前面示例中相同的输出。这个方法比 property() 函数相对容易使用。

使用 @property 装饰器,我们使用返回属性作为属性名称的函数。之后,@<property-name>.setter@<property-name>.deleter 将添加 setter 和 deleter 方法。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn