【问题标题】:Usefulness of property decorator in python for mutable attributespython中属性装饰器对可变属性的用处
【发布时间】: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

【问题讨论】:

标签: python oop properties


【解决方案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,您可以轻松地将现有属性转换为属性,而无需使用这些属性更改任何代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 2020-10-07
    • 2012-07-15
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2018-12-03
    相关资源
    最近更新 更多