当我将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
...
>>>
我只进行了语法更改,但此版本没有出错。为什么呢?
答案 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)