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

 

posted @ 2017-11-12 09:26  xiongjiawei  阅读(47)  评论(0)    收藏  举报