python中属性装饰器对可变属性的有用性
当我们需要能够设置属性时,尝试理解Python中属性的好处。明确查看这两种技术的优缺点 在Python中使用@prop.setter的@property有哪些好处:python中属性装饰器对可变属性的有用性,python,oop,properties,Python,Oop,Properties,当我们需要能够设置属性时,尝试理解Python中属性的好处。明确查看这两种技术的优缺点 在Python中使用@prop.setter的@property有哪些好处: class Foo2: def __init__(self, prop): self.prop = prop @property def prop(self): return self._prop @prop.setter def prop(self, v
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
您创建了一个无法删除的属性:
>>> 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
处理程序,那么创建这样的属性实际上没有任何好处。将普通属性访问可以做的事情委托给函数并没有那么有用
属性设置器或getter在执行除设置属性之外的其他操作(如验证或转换)时更有用
例如,setter可以强制值始终为整数,包括在转换为整数失败时设置默认值:
@prop.setter
def prop(self, value):
try:
self._prop = int(prop)
except ValueError:
self._prop = 0
在其他编程语言(如Java)中,您无法轻松地将属性转换为getter和setter(Java中没有与Python属性等效的概念),而不必在代码库中的任何地方重新编写对这些属性的所有访问权限,因此在这些语言中,您经常看到从getter和setter开始的建议这不适用于Python,您可以轻松地将现有属性转换为属性,而无需更改使用这些属性的任何代码。您创建了一个无法删除的属性:
>>> 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
处理程序,那么创建这样的属性实际上没有任何好处。将普通属性访问可以做的事情委托给函数并没有那么有用
属性设置器或getter在执行除设置属性之外的其他操作(如验证或转换)时更有用
例如,setter可以强制值始终为整数,包括在转换为整数失败时设置默认值:
@prop.setter
def prop(self, value):
try:
self._prop = int(prop)
except ValueError:
self._prop = 0
在其他编程语言(如Java)中,您无法轻松地将属性转换为getter和setter(Java中没有与Python属性等效的概念),而不必在代码库中的任何地方重新编写对这些属性的所有访问权限,因此在这些语言中,您经常看到从getter和setter开始的建议这不适用于Python,您可以轻松地将现有属性转换为属性,而无需更改使用这些属性的任何代码。可能重复的