@chyoo1991
2015-09-08T02:38:42.000000Z
字数 1456
阅读 1194
python
property
class Celsius:
def __init__(self, temperature = 0):
self.temperature = temperature
def 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) + 32
def get_temperature(self): # 如果在没有set_temperature之前调用此函数会发生什么
return self._temperature # 实际上因为__init__函数已经初始化,所以会返回0
def 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) + 32
def get_temperature(self):
print "Getting Value"
return self._temperature
def set_temperature(self, value):
if value < -273:
raise ValueError("Temperature below -273 is not possible")
self._temperature = value
temperature = property(get_temperature, set_temperature) # 此处我的疑虑甚多,为什么不是 self.temperature? 这样写是类变量而不是成员变量
代码最后一行增加了
temperature
对象。property
将一些代码get_temperature
和set_temperature
附加到成员属性(temperature)的访问入口。任何获取temperature值的代码都会自动调用get_temperature
,而不会去查__dict__
。下午抽时间再看。