【发布时间】:2016-10-12 16:45:32
【问题描述】:
我现在正在尝试正确地学习 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')
和
class MyClassNoAt:
def __init__(self, value):
self._time = value
def get_time(self):
return self._time
def set_time(self, value):
if value > 0:
self._time = value
else:
raise ValueError('Time should be positive')
time = property(fget=get_time, fset=set_time)
是否有使用哪个协议? Pythonista 会选择什么?
【问题讨论】:
-
两者是等价的。第一种形式肯定更常见。
-
首选第一种形式。在第二种形式中,您公开了两个额外的方法,
set_time和get_time,它们现在是您的公共 api 的一部分,并且具有单独的 set 和 get 方法违背了属性的目的。 -
@property完全一样,只是使用property()对象作为装饰器。尽可能使用装饰器表单。 -
大家都说应该用第一种形式。所以有协议,没有“意见”。这个问题仍然被投票以基于意见的方式结束。虽然我没有问“你喜欢哪个”,而是“如果有协议”。无论如何,谢谢大家的回答。
-
是的,我同意。询问为什么有两种语法以及何时使用一种而不是另一种的原因并不是基于意见的。