属性装饰器是一种很好的方法来“保护”一个想要设置的属性,而不会再次改变.我通常以这种方式处理这个问题(顺便说一句,遵循建议
here):
self._name = 'foo'
@property
def name(self):
return self._name
因此,尝试直接设置名称会产生AttributeError.
但是,我经常看到以下模式:
@name.setter
def name(self, value):
self._name = value
@property
def name(self):
return self._name
这似乎有点违反直觉,因为它能够完全实现我想要避免的东西,并且需要额外的编码,即理论上
self.name = 'bar'
虽然很明显这将是处理问题的最糟糕方式,但这已经足够了.
我能想出的最好的解释就是来自作者的一条消息,说“你不应该改变这个属性,但如果你真的想要,那就有一种机制可以在不改变’protected’属性的情况下”.但是,python并没有真正保护属性.
那么,重点是什么呢?为什么呢?
最佳答案 你是正确的,如果你没有在getter或setter做任何特别的事情,没有充分的理由使用一个属性.但是,如果你想做一些特别的事情(比如验证新值,或者以某种方式对它们进行规范化),那么它就很有意义.
例如,此类的foo属性将始终夹在0和1之间(非数值将立即导致错误):
class Foo:
_foo = 1.0
@foo
def probability(self):
return self._foo
@foo.setter
def foo(self, value):
if value < 0:
value = 0
elif value > 1:
value = 1
self._foo = value
一个简单的setter的例子,但复杂的getter可能是这样的(推迟可能不需要的昂贵的初始化):
class Foo:
_foo = None
def initialize_foo(self):
self._foo = some_expensive_calculation()
@property
def foo(self):
if self._foo is None:
self.initialize_foo() # need the default value
return self._foo
@foo.setter
def foo(self, value):
self._foo = value