@chyoo1991
2015-09-08T02:38:42.000000Z
字数 1456
阅读 1258
python property
class Celsius:def __init__(self, temperature = 0):self.temperature = temperaturedef to_fahrenheit(self):return (self.temperature * 1.8) + 32
temperature 是 Celsius 实例的属性,可以从实例的
__dict__属性中看出。类也是对象,可以想想类中会不会存在__dict__属性呢?
class Celsius:def __init__(self, temperature = 0):self.set_temperature(temperature)def to_fahrenheit(self):return (self.get_temperature() * 1.8) + 32def get_temperature(self): # 如果在没有set_temperature之前调用此函数会发生什么return self._temperature # 实际上因为__init__函数已经初始化,所以会返回0def set_temperature(self, value):if value < -273:raise ValueError("Temperature below -273 is not possible") #raise语法self._temperature = value
这里面的_temperature是个私有属性,只是编码时的规范限制,并不能真正做到类似于
Java那样语言层级的私有访问限制。Python本身不提供私有变量。
one = Celsius()one._temperature = -279 # 此处能赋值成功print one.get_temperatuer() # 会返回-279
这样将类升级了之后,原来代码中的
object.temperature = xxx都要替换为object.set_temperature(xxx),如果代码行数很多的话,怎么破呢?这时候可以使用property了。
class Celsius:def __init__(self, temperature = 0):self.temperature = temperature # 这点需要注意,特别def to_fahrenheit(self):return (self.temperature * 1.8) + 32def get_temperature(self):print "Getting Value"return self._temperaturedef set_temperature(self, value):if value < -273:raise ValueError("Temperature below -273 is not possible")self._temperature = valuetemperature = property(get_temperature, set_temperature) # 此处我的疑虑甚多,为什么不是 self.temperature? 这样写是类变量而不是成员变量
代码最后一行增加了
temperature对象。property将一些代码get_temperature和set_temperature附加到成员属性(temperature)的访问入口。任何获取temperature值的代码都会自动调用get_temperature,而不会去查__dict__。下午抽时间再看。