我现在正在尝试正确学习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)
有使用哪一个协议(protocol)吗? Pythonista 会选择什么?
最佳答案
它们是等效的,但首选第一个,因为许多人发现它更具可读性(同时也不会使代码和命名空间困惑)。 第二种方法的问题是您定义了两个永远不会使用的方法,并且它们保留在类中。
只有当必须支持非常旧的 Python 版本(不支持装饰器语法糖)时,才会使用第二种方法。 Python 2.4 中添加了函数和方法装饰器(而类装饰器仅在版本 2.6 中添加),因此在几乎所有情况下这都是过去的问题。
关于python - 使用 property() 和 @property 定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40004026/