加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读