[关闭]
@chyoo1991 2015-09-08T02:38:42.000000Z 字数 1456 阅读 1194

Python中的property

python property


最开始

  1. class Celsius:
  2. def __init__(self, temperature = 0):
  3. self.temperature = temperature
  4. def to_fahrenheit(self):
  5. return (self.temperature * 1.8) + 32

temperature 是 Celsius 实例的属性,可以从实例的__dict__属性中看出。类也是对象,可以想想类中会不会存在__dict__属性呢?

温度限制

  1. class Celsius:
  2. def __init__(self, temperature = 0):
  3. self.set_temperature(temperature)
  4. def to_fahrenheit(self):
  5. return (self.get_temperature() * 1.8) + 32
  6. def get_temperature(self): # 如果在没有set_temperature之前调用此函数会发生什么
  7. return self._temperature # 实际上因为__init__函数已经初始化,所以会返回0
  8. def set_temperature(self, value):
  9. if value < -273:
  10. raise ValueError("Temperature below -273 is not possible") #raise语法
  11. self._temperature = value

这里面的_temperature是个私有属性,只是编码时的规范限制,并不能真正做到类似于Java那样语言层级的私有访问限制。Python本身不提供私有变量。

  1. one = Celsius()
  2. one._temperature = -279 # 此处能赋值成功
  3. print one.get_temperatuer() # 会返回-279

这样将类升级了之后,原来代码中的object.temperature = xxx都要替换为object.set_temperature(xxx),如果代码行数很多的话,怎么破呢?这时候可以使用property了。

property

  1. class Celsius:
  2. def __init__(self, temperature = 0):
  3. self.temperature = temperature # 这点需要注意,特别
  4. def to_fahrenheit(self):
  5. return (self.temperature * 1.8) + 32
  6. def get_temperature(self):
  7. print "Getting Value"
  8. return self._temperature
  9. def set_temperature(self, value):
  10. if value < -273:
  11. raise ValueError("Temperature below -273 is not possible")
  12. self._temperature = value
  13. temperature = property(get_temperature, set_temperature) # 此处我的疑虑甚多,为什么不是 self.temperature? 这样写是类变量而不是成员变量

代码最后一行增加了temperature对象。property将一些代码get_temperatureset_temperature附加到成员属性(temperature)的访问入口。任何获取temperature值的代码都会自动调用get_temperature,而不会去查__dict__

下午抽时间再看。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注