【发布时间】:2018-03-27 00:29:01
【问题描述】:
我正在比较 python 中 @property 的三个略有不同的实现。 Python 文档和“Source 1”初始化私有变量_var_name。此外,Source 1 中的代码有一个错误;初始化时它不访问.setter。相比之下,第三个示例正确初始化了公共变量x。
是否有充分的理由初始化_x 来代替__init__ 中的x?这些之间是否还有我没有描述的其他差异?
来自docs:
class C:
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
class Celsius:
def __init__(self, temperature = 0):
self._temperature = temperature
def to_fahrenheit(self):
return (self.temperature * 1.8) + 32
@property
def temperature(self):
print("Getting value")
return self._temperature
@temperature.setter
def temperature(self, value):
if value < -273:
raise ValueError("Temperature below -273 is not possible")
print("Setting value")
self._temperature = value
class P:
def __init__(self,x):
self.x = x
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
if x < 0:
self.__x = 0
elif x > 1000:
self.__x = 1000
else:
self.__x = x
【问题讨论】:
-
另一个区别是
Celsius.temperature是一个非常有意义的名字,而P.x,谁知道它是什么意思,或者为什么它的范围是0-1000。但我相信你已经知道了。