@property和property()之间的区别

时间:2014-03-17 11:47:16

标签: python properties decorator python-decorators

之间有区别吗?
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的目标,即只有一种明显的做事方式。有没有首选方式?如果是这样,为什么?

2 个答案:

答案 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)

对于您的确切代码,我在Python 3.7中进行了比较。 enter image description here

这表明堆栈机Python的bitecode会有所不同,但几乎相同。