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