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

时间:2019-06-15 17:54:52

标签: python oop properties

当我们需要设置属性时,尝试了解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

1 个答案:

答案 0 :(得分:2)

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

>>> 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属性的等效概念),基础,因此在这些语言中,您经常会看到从吸气剂和吸气剂开始的建议。 这不适用于Python ,您可以轻松地将现有属性转换为属性,而不必使用这些属性更改任何代码。