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中属性装饰器对可变属性的用处的主要内容,如果未能解决你的问题,请参考以下文章