之间有区别吗?
class Example(object):
def __init__(self, prop):
self._prop = prop
def get_prop(self):
return self._prop
def set_prop(self, prop):
self._prop = prop
prop = property(get_prop, set_prop)
和
class Example2(object):
def __init__(self, prop):
self._prop = prop
@property
def prop(self):
return self._prop
@prop.setter
def prop(self, prop):
self._prop = prop
他们似乎做了同样的事情,这并不符合python的目标,即只有一种明显的做事方式。有没有首选方式?如果是这样,为什么?
答案 0 :(得分:6)
@decorator
语法只是语法糖。除了语法之外,两种方法之间没有区别,最终结果是相同的。
@property
def prop(self):
return self._prop
被翻译为:
def prop(self):
return self._prop
prop = property(prop)
同样适用于setter:
@prop.setter
def prop(self, prop):
self._prop = prop
变为:
tmp = prop.setter
def prop(self, prop):
self._prop = prop
prop = tmp(prop)
首先评估装饰器表达式(prop.setter
)。有关.setter()
(以及.deleter()
和.getter()
)的工作原理,请参阅How does the @property decorator work?。
请注意,属性对象的prop.setter()
装饰器(以及.getter()
和.deleter()
装饰器)仅在Python 2.6中添加。此外,在版本2.2中将property
添加到Python中,但装饰器仅添加到Python 2.4中的语言中。
因此,许多文档仍然使用较旧的property
构造函数方法。
但是,如果您要编写Python 2.6或更高版本,则应该使用装饰器语法。
@property
和@prop.setter
装饰器提供了一个清晰的早期视觉信号,您在此处拥有属性函数,而属性函数之后的单独prop = property(...)
行是容易错过,特别是如果房产实施时间更长。
答案 1 :(得分:0)