首先看一个“摄氏度”class的例子:
class Celsius:
def __init__(self, temperature = 0):
self.temperature = temperature
def to_fahrenheit(self):
return (self.temperature * 1.8) + 32
c = Celsius(23)
c.temperature #23
这个class并没有对摄氏度进行限制,因为摄氏度时不可能低于绝对零度的,所以我们将这个class改写为:
class Celsius:
def __init__(self, temperature = 0):
self.set_temperature(temperature)
def to_fahrenheit(self):
return (self.get_temperature() * 1.8) + 32
# new update
def get_temperature(self):
return self._temperature
def set_temperature(self, value):
if value < -273:
raise ValueError("Temperature below -273 is not possible")
self._temperature = value
c = Celsius(23)
c.temperature
#AttributeError: 'Celsius' object has no attribute 'temperature'
c.get_temperature()
#23
但是这样改写就会出现问题,新的写法并不向后兼容。
之前的obj.temperature = val 都要改成 obj.set_temperature(val) 形式。一种解决方案是:
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")
print("Setting value")
self._temperature = value
temperature = property(get_temperature,set_temperature)
新添加的: temperature = property(get_temperature,set_temperature) 创建了 property object.
property(fget=None, fset=None, fdel=None, doc=None)
在这个例子中get_temperature和set_temperature分别是提取和设置变量的函数。
temperature = property(get_temperature,set_temperature)
等同于:
# make empty property
temperature = property()
# assign fget
temperature = temperature.getter(get_temperature)
# assign fset
temperature = temperature.setter(set_temperature)
可以用decorators 写的再规范些:
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