从其中一个博客中,我有以下代码,我用它来理解python property
的工作。
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
Q1:在__init__
方法下,为什么作者使用self._temperature
。它应该不是self.temperature
吗?控件如何转到@temperature.setter
?
答案 0 :(得分:2)
在self._temperature
中使用__init__()
是否正确有时是品味问题。实质上,现在有第三种方法(除setter
和getter
之外)知道实际值存储的属性。 IMO不好,如果你重构类并改变属性可能会导致错误,但它本身并不正确。
可能存在这样的情况:setter已经假设某个值以其他方式存储。不在这里,但是例如只有在self._temperature
增加时才应设置hasattr(self, "_temperature")
。在这种情况下,您必须直接访问该属性。 (通过使用setter和getter中的 self.temperature = some_value
测试“存储”属性并进行适当初始化,可以避免这种情况。
控制权永远不会出现在设定者身上。如果你这样做,就会使用setter:
self._temperate
您始终可以直接从任何其他方法设置“隐藏”属性(在本例中为Celsius
)(或直接访问update table_name
set cod_user =
CASE
WHEN user_rol = 'student' THEN '622057'
WHEN user_rol = 'assistant' THEN '2913659'
WHEN user_rol = 'admin' THEN '6160230'?
END,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
AND cod_office = '17389551';
实例上的属性)。请注意,这恰好是之前带有下划线的属性名称,它可以是任何(免费)名称。