python为什么选择setter?
发布时间:2020-12-20 12:03:43 所属栏目:Python 来源:网络整理
导读:属性装饰器是一种很好的方法来“保护”一个想要设置的属性,而不会再次改变.我通常以这种方式处理这个问题(顺便说一句,遵循建议 here): self._name = 'foo'@propertydef name(self): return self._name 因此,尝试直接设置名称会产生AttributeError. 但是,我
属性装饰器是一种很好的方法来“保护”一个想要设置的属性,而不会再次改变.我通常以这种方式处理这个问题(顺便说一句,遵循建议
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |