【发布时间】:2018-03-10 20:52:37
【问题描述】:
属性装饰器是一种很好的方式来“保护”一个想要设置一次并且不再更改的属性。我通常以这种方式处理(顺便说一句,遵循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'
就足够了,尽管很明显这将是解决问题的最糟糕的方法。
我能想到的最好的解释是来自作者的一条消息,说“你不应该更改此属性,但如果你真的想要,有一种机制可以在不更改‘受保护’属性的情况下进行更改”。但是,python 并没有真正保护属性。
那么,重点是什么,哪个更符合 Python 风格,为什么?
【问题讨论】:
标签: python properties setter