Python setter装饰器是如何工作的

Fla*_*ien 3 python decorator

我刚刚开始使用Python,所以如果我遗漏了一些明显的东西,请耐心等待.我已经阅读了有关装饰器以及它们如何工作的内容,我正在尝试理解它是如何被翻译的:

class SomeObject(object):

    @property
    def test(self):
        return "some value"

    @test.setter   
    def test(self, value):
        print(value)
Run Code Online (Sandbox Code Playgroud)

从我所读到的,这应该变成:

class SomeObject(object):

    def test(self):
        return "some value"

    test = property(test)

    def test(self, value):
        print(value)

    test = test.setter(test)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这个时,我得到了

AttributeError: 'function' object has no attribute 'setter'
Run Code Online (Sandbox Code Playgroud)

有人可以解释翻译在这种情况下的工作原理吗?

Luc*_*ian 7

你得到的理由AttributeError是,def test重新定义test在类的范围.类中的函数定义绝不是特殊的.

你的例子就是这样的

class SomeObject(object):

    def get_test(self):
        return "some value"

    def set_test(self, value):
        print(value)

    test = property(get_test)
    test = test.setter(set_test)
    # OR
    test = property(get_test, set_test)
Run Code Online (Sandbox Code Playgroud)

  • 因为描述符仅在类上设置时才有效.在属性检索期间,Python将检查类上的描述符并在它们存在时调用它们.另一个例子是绑定方法.SomeObject.get_test`是你的原始函数,它接受一个参数,但`someinstance.get_test is`是一个不带参数的绑定方法.它将一些实例作为第一个参数进行了讨论("冻结"). (3认同)