python中属性装饰器对可变属性的用处

Posted

技术标签:

【中文标题】python中属性装饰器对可变属性的用处【英文标题】:Usefulness of property decorator in python for mutable attributes 【发布时间】:2019-10-29 22:57:36 【问题描述】:

当我们需要能够设置属性时,尝试了解 Python 中属性的好处。明确地查看这两种技术的优缺点。

在 Python 中使用 @property 和 @prop.setter 有什么好处:

class Foo2:

    def __init__(self, prop):
        self.prop = prop

    @property
    def prop(self):
        return self._prop

    @prop.setter
    def prop(self, value):
        self._prop = value

与没有属性装饰器的简单设置属性相比?

class Foo:
    def __init__(self, prop):
        self.prop = prop

【问题讨论】:

Real world example about how to use property feature in python?的可能重复 【参考方案1】:

您创建了一个无法删除的属性

>>> f = Foo2('bar')
>>> f.prop
'bar'
>>> f.prop = 'spam'
>>> f.prop
'spam'
>>> del f.prop
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't delete attribute

将此与Foo().prop 属性进行比较,可以删除:

>>> f = Foo('bar')
>>> f.prop
'bar'
>>> del f.prop
>>> f.prop
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'prop'

除此之外,或者如果您添加了@prop.deleter 处理程序,那么创建这样的属性并没有任何优势。将普通属性访问可以做的事情委托给一个函数并没有那么有用。

属性设置器或获取器在执行其他操作时会更有用,而不仅仅是设置属性,例如验证或转换。

例如,setter 可以强制值始终为整数,包括在转换为整数失败时设置默认值:

@prop.setter
def prop(self, value):
    try:
        self._prop = int(prop)
    except ValueError:
        self._prop = 0

在其他编程语言(如 Java)中,您无法轻松地将属性转换为 getter 和 setter(Java 中没有与 Python 属性等效的概念),而无需在代码中的任何位置重新编写对这些属性的所有访问 - base,所以在这些语言中,您经常会看到从 getter 和 setter 开始的建议。 这不适用于 Python,您可以轻松地将现有属性转换为属性,而无需使用这些属性更改任何代码。

【讨论】:

以上是关于python中属性装饰器对可变属性的用处的主要内容,如果未能解决你的问题,请参考以下文章

装饰器 (Decorator)

python属性装饰器[重复]

ES6装饰器Decorator基本用法

Python,如何添加另一个装饰器来过滤现有多装饰器的输出与python中的属性?

在 Python 中使用属性的删除器装饰器

python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变