>>>class MyDecriptor: #定义一个描述符类
def __get__(self,instance,owner):
print("getting...",self,instance,owner)
def __set__(self,instance,value):
print("setting...",self,instance,value)
def __delete__(self,instance):
print("deleting...",self,instance)
>>> class Test: #类的实例
x = MyDecriptor()
>>> test = Test()
>>> test.x
getting... <__main__.MyDecriptor object at 0x000000000315BC88> <__main__.Test object at 0x000000000315BBE0> <class '__main__.Test'>
>>> test
<__main__.Test object at 0x000000000315BBE0>
>>> Test
<class '__main__.Test'>
>>> test.x = "x-man" #赋值,会调用setting
setting... <__main__.MyDecriptor object at 0x000000000315BC88> <__main__.Test object at 0x000000000315BBE0> x-man
>>> del test.x
deleting... <__main__.MyDecriptor object at 0x000000000315BC88> <__main__.Test object at 0x000000000315BBE0>
定义一个属于自己的property()函数:
>>> 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=man'
>>> c.x
'x=man'
>>> c._x
'x=man'
>>> del c.x
练习:
摄氏度 * 1.8 + 32 =华氏度
class Celsius:
def __init__(self,value = 26.0):
self.value = float(value) #最后设置到self.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
def __set__(self,instance,value):
instance.cel = (float(value) - 32) / 1.8 #set方法被激发,cel对象赋值
class Temperature:
cel = Celsius() #即是对cel属性赋值,cel也有一个描述符类Celsius()
fah = Fahrenheit() #fah赋值,描述符类描述的fah属性,当属性被赋值,激发描述符类的set方法
运行测试:
>>> temp.fah
86.0
>>> temp.fah = 100
>>> temp.cel
37.77777777777778