描述符 : 将某种特殊类型的类的实例指派给另一个类的属性。
特殊类型为以下方法的1-3个 :
- __get__(self, instance, owner):
用于访问属性,它返回属性的值
- __set__(self, instance, value):
将在属性分配操作中调用,不返回任何内容
- __delete__(self, instance):
控制删除操作,不返回任何内容
An example : design a property
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| >>> class MyProperty: def __init__(self, fget=None, fset=None, fdel=None): self.fget = fget self.fset = fset self.fdel = fdel def __get__(self, instance, owner): return self.fget(instance) def __set__(self, instance, value): self.fset(instance, value) def __delete__(self, instance): self.fdel(instance)
>>> class C: def __init__(self): self._x = None def getX(self): return self._x def setX(self, value): self._x = value def delX(self): del self._x x = MyProperty(getX, setX, delX)
>>> c = C() >>> c.x = 'X' >>> c.x 'X' >>> del c.x
|
Magic Methods 5"定义一个温度类,再定义两个描述符类用于描述摄氏度和华氏度两个属性。要求属性可以自动进行转换。(°F = 1.8 * °C + 32)">定义一个温度类,再定义两个描述符类用于描述摄氏度和华氏度两个属性。要求属性可以自动进行转换。(°F = 1.8 * °C + 32)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Celsius: def __init__(self, value = 26.0): self.value = float(value) def __get__(self, instance, owner): return self.value def __set__(self, instance, value): self.value = float(value) class Fahrenheit: def __get__(self, instance, owner): return instance.cel * 1.8 + 32.0 def __set__(self, instance, value): instance.cel = (float(value) - 32.0) / 1.8
class Temperature: # 定义cel属性的Celsius类 cel = Celsius() # 定义fah属性的Fahrenheit类 fah = Fahrenheit()
|
Result:
1 2 3 4 5 6 7 8 9 10 11 12 13
| >>> temp = Temperature() >>> temp <__main__.Temperature object at 0x105815438> >>> temp.cel 26.0 >>> temp.cel = 40 >>> temp.cel 40.0 >>> temp.fah 104.0 >>> temp.fah = 100 >>> temp.cel 37.77777777777778
|