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 方法附加為資料成員的屬性。
為此,我們在屬性函式中使用 fget
、fset
、fdel
和 doc
引數。
與 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 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