当我们需要设置属性时,尝试了解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
答案 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 ,您可以轻松地将现有属性转换为属性,而不必使用这些属性更改任何代码。