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