应用相同的属性装饰器的不同结果

时间:2018-02-04 14:21:06

标签: python python-3.x properties

当我将property装饰器应用于类定义中的方法时,python接受具有@decorator但不具有显式语法的版本。以下是代码:

>>> class Person:
...     first_name = property()
...     def first_name(self):
...         pass
...     first_name = first_name.getter(first_name)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in Person
AttributeError: 'function' object has no attribute 'getter'

我可以理解这个结果 - 虽然first_name被定义为property对象,但它被重新定义为没有getter方法的函数对象。    但是,以下代码如何工作 -

>>> class Person:
...     first_name = property()
...     @first_name.getter
...     def first_name(self):
...         pass
... 
>>> 

我只进行了语法更改,但此版本没有出错。为什么呢?

1 个答案:

答案 0 :(得分:1)

在第一个示例中,您使用函数覆盖了first_name中的属性。默认情况下,函数没有getter属性。 def是语法糖(类似于):

first_name = property()

# def replacement
first_name = lambda self: None

first_name = first_name.getter(first_name)

第二个使用装饰器,因此first_name返回property().getter(func)。这是一个属性。

这一切的正常风格是:

@property
def first_name(self):
    pass

或多或少与:

相同
first_name = property(lambda self: None)

getter / setter样式有效,因为在将函数分配给命名空间之前引用了decorator(事实上,当使用装饰器时,没有将函数分配给命名空间的中间步骤。)

first_name = property()
# this is effectively how the function definition and decorator code is executed
first_name = first_name.getter(lambda self: None)