Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用property()和@property定义的属性_Python_Oop - Fatal编程技术网

Python 使用property()和@property定义的属性

Python 使用property()和@property定义的属性,python,oop,Python,Oop,我现在正试图正确地学习Python,我对创建对象属性的两种方法感到困惑:使用@property装饰器和property()方法。因此,以下两项都是有效的: class MyClassAt: def __init__(self, value): self._time = value @property def time(self): return self._time @time.setter def time(self,

我现在正试图正确地学习Python,我对创建对象属性的两种方法感到困惑:使用
@property
装饰器和
property()
方法。因此,以下两项都是有效的:

class MyClassAt:
    def __init__(self, value):
        self._time = value

    @property
    def time(self):
        return self._time

    @time.setter
    def time(self, value):
        if value > 0:
            self._time = value
        else:
            raise ValueError('Time should be positive')


是否有使用哪一个的协议?Pythonista会选择什么?

它们是等效的,但是第一个是首选的,因为许多人觉得它更可读(同时也不会弄乱代码和名称空间)。 第二个方法的问题是,您正在定义两个永远不会使用的方法,而它们仍保留在类中

只有在必须支持非常旧的Python版本(不支持decorators)时,才会使用第二种方法。函数和方法修饰符是在Python 2.4中添加的(而类修饰符仅在版本2.6中添加),因此这几乎在所有情况下都是过去的问题。

在过去(在Python 2.4之前),修饰符语法(即
@property
)还不存在,因此创建装饰函数的唯一方法是使用第二种方法

time = property(fget=get_time, fset=set_time)
新语法背后的动机有很多原因,但最重要的可能是这个原因

对函数或函数应用变换的当前方法 方法将实际转换放置在函数体之后。对于 大型函数这将分离函数的一个关键组件 函数的其余外部对象的定义中的行为 接口

使用较新的
@
语法,只需浏览代码并查看方法/属性定义,就可以更清楚地看到属性的存在

不幸的是,当他们第一次添加新的
@property
decorator时,它只用于修饰getter。如果有setter或deleter函数,则仍必须使用旧语法

幸运的是,在Python2.6中,他们将
getter
setter
deleter
属性添加到属性中,这样您就可以对所有属性使用新语法


现在,真的没有理由使用旧语法来修饰函数和类。

两者都是等价的。第一种形式肯定更常见。第一种形式更可取。在第二种形式中,您公开了另外两个方法,
set\u-time
get\u-time
,它们现在是公共api的一部分,使用单独的set和get方法会破坏属性的用途。
@property
完全是一样的,只需将
property()
对象用作装饰器即可。尽可能使用decorator表单。每个人都说应该使用第一个表单。所以有一个协议,没有“意见”。尽管如此,该问题仍被投票决定以基于意见的方式结束。虽然我没有问“你更喜欢哪一个”,但是“如果有协议的话”。无论如何,谢谢大家的回答。是的,我同意。询问为什么有两种语法,以及何时使用一种语法而不是另一种语法的原因不是基于观点的。
time = property(fget=get_time, fset=set_time)