python为什么选择setter?

属性装饰器是一种很好的方法来“保护”一个想要设置的属性,而不会再次改变.我通常以这种方式处理这个问题(顺便说一句,遵循建议
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
点赞