Python描述符Property将特殊类的实例分配给普通类的属性
代码:
1 class TestProperty: 2 def __init__(self,fget=None,fset=None,fdel=None): 3 self.fget=fget 4 self.fset=fset 5 self.fdel=fdel 6 def __get__(self,instance,owner): 7 print(self,instance,owner) 8 def __set__(self,instance,value): 9 print(self,instance,value) 10 def __delete__(self,instance): 11 print(self,instance) 12 13 class C: 14 x=TestProperty()
演示结果:
1 >>> c=C() 2 >>> c.x 3 <__main__.TestProperty object at 0x000000000307C438> <__main__.C object at 0x0000000003107DD8> <class '__main__.C'> 4 >>> c.x='abc' 5 <__main__.TestProperty object at 0x000000000307C438> <__main__.C object at 0x0000000003107DD8> abc 6 >>> del c.x 7 <__main__.TestProperty object at 0x000000000307C438> <__main__.C object at 0x0000000003107DD8> 8 >>>
可以看到:
self=<__main__.TestProperty object at 0x000000000307C438>
instance=<__main__.C object at 0x0000000003107DD8>
owner=<class '__main__.C'>
value=abc
实例:
1 class TestProperty2: 2 def __init__(self,fget=None,fset=None,fdel=None): 3 self.fget=fget 4 self.fset=fset 5 self.fdel=fdel 6 def __get__(self,instance,owner): 7 return self.fget(instance) 8 def __set__(self,instance,value): 9 self.fset(instance,value) 10 def __delete__(self,instance): 11 self.fdel(instance) 12 13 class C: 14 def __init__(self): 15 self._x=None 16 def getX(self): 17 return self._x 18 def setX(self,value): 19 self._x=value 20 def delX(self): 21 del self._x 22 x=TestProperty2(getX,setX,delX)
演示结果:
1 >>> c=C() 2 >>> c.x 3 >>> c.x=123 4 >>> c.x 5 123 6 >>> del c.x 7 >>> c.x 8 Traceback (most recent call last): 9 File "<pyshell#24>", line 1, in <module> 10 c.x 11 File "C:\Users\17080161\Desktop\p.py", line 7, in __get__ 12 return self.fget(instance) 13 File "C:\Users\17080161\Desktop\p.py", line 17, in getX 14 return self._x 15 AttributeError: 'C' object has no attribute '_x'
实用例子:
1 class Kilometre: 2 def __init__(self,_km=0): 3 self._km=float(_km) 4 def __get__(self,instance,owner): 5 return self._km 6 def __set__(self,instance,value): 7 self._km=float(value) 8 9 class Mile: 10 def __get__(self,instance,owner): 11 return instance.km*1.60931 12 def __set__(self,instance,value): 13 instance.km=value/1.60931 14 15 class Distance: 16 km=Kilometre() 17 m=Mile()
演示结果:
1 >>> d=Distance() 2 >>> d.km 3 0.0 4 >>> d.m 5 0.0 6 >>> d.km=1 7 >>> d.km 8 1.0 9 >>> d.m 10 1.60931 11 >>> d.m=2 12 >>> d.m 13 2.0 14 >>> d.km 15 1.2427686399761388