@property和property()之间的区别

Bos*_*ash 2 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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

他们似乎做了同样的事情,这不符合python的目标,即只有一种明显的做事方式.有没有首选方式?如果是这样,为什么?

Mar*_*ers 6

@decorator语法只是语法糖.除了语法之外,两种方法之间没有区别,最终结果是相同的.

@property
def prop(self):
    return self._prop
Run Code Online (Sandbox Code Playgroud)

被翻译成:

def prop(self):
    return self._prop
prop = property(prop)
Run Code Online (Sandbox Code Playgroud)

这同样适用于二传手:

@prop.setter
def prop(self, prop):
    self._prop = prop
Run Code Online (Sandbox Code Playgroud)

变为:

tmp = prop.setter
def prop(self, prop):
    self._prop = prop
prop = tmp(prop)
Run Code Online (Sandbox Code Playgroud)

因为prop.setter首先评估装饰器表达式().请参阅@property装饰器如何工作?如何.setter()(.deleter().getter())工作.

需要注意的是prop.setter()装饰(和.getter().deleter()属性的对象的装饰)在Python 2.6只添加.另外,property在2.2版本中添加了Python,但装饰器只添加到Python 2.4中的语言中.

因此,许多文档仍然使用旧的property构造函数方法.

但是,如果您要编写Python 2.6或更高版本,则应该使用装饰器语法.

@property@prop.setter装饰给出一个明确的,你有产权的功能在这里的视觉信号,而单独的prop = property(...)属性功能后线容易漏诊,特别是如果属性实现更长.