鱼C论坛

 找回密码
 立即注册
查看: 1508|回复: 0

[技术交流] 十一章节:描述符(property原理)

[复制链接]
发表于 2017-8-27 10:54:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 向西而笑 于 2017-8-27 10:56 编辑
课时46:描述符(property的原理)
描述符概念

描述符就是将某个特殊类的实例指派给另一个类做属性。
它有一下几个特点:它的实例对象是另一个类的属性;拥有下面例举的方法:

__get__(self,instance,owner):用于访问属性,它返回属性的值
__set__(self,instance,value):将在属性分配操作中调用,不返回任何内容
__delete__(self,instance)控制删除操作,不返回任何内容

以上三个方法属于描述符属性方法。虽然和上节课学的三个方法看起来差不多,但实现起来是两码事
举例:
  1. class Descriptor:
  2.     def __get__(self,instance,owner):
  3.         print('getting...','\n'
  4.               'self:', self,'\n'
  5.               'instance:', instance,'\n'
  6.               'owner:', owner)

  7.     def __set__(self,instance,value):
  8.         print('setting...','\n'
  9.               'self:', self,'\n'
  10.               'instance:', instance,'\n'
  11.               'value:', value)

  12.     def __delete__(self,instance):
  13.         print('deleting...','\n'
  14.               'self:', self,'\n'
  15.               'instance:', instance)
复制代码
测试结果:

  1. >>>class Test:
  2.     x = Descriptor()

  3. >>> test = Test()

  4. >>> test.x
  5. getting...
  6. self: <__main__.Descriptor object at 0x0100FAB0>
  7. instance: <__main__.Test object at 0x032BEC10>
  8. owner: <class '__main__.Test'>

  9. >>> test.x = 'X-man'
  10. setting...
  11. self: <__main__.Descriptor object at 0x0100FAB0>
  12. instance: <__main__.Test object at 0x032BEC10>
  13. value: X-man

  14. >>> del test.x
  15. deleting...
  16. self: <__main__.Descriptor object at 0x0100FAB0>
  17. instance: <__main__.Test object at 0x032BEC10>

复制代码
从上面的例子就能看出:
self的指的是Descriptor的实例对象,也就是x;
instance指的是Test的实例对象,即test
owner指的是Test这个类,它拥有描述符类和描述符对象

定制自己的property
到这里我知道了之前学的内置函数property其实是一个描述符类。知道这个后根据上面的例子,我们可以来定制自己的property。


  1. class Myproperty:
  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.         
  11.     def __delete__(self,instance):
  12.         self.fdel(instance)


  13. class X:
  14.     def __init__(self, initial_value=10):
  15.         self.__example = initial_value    #初始一个值为10的属性example      

  16.     def x_get(self):
  17.         return self.__example

  18.     def x_set(self,value):
  19.         self.__example = value

  20.     def x_del(self):
  21.         del self.__example

  22.     control = Myproperty(x_get,x_set,x_del)    #定义一个属性control,通过control来操作example。相当于给出了一个接口去访问example

复制代码
运行结果:
  1. >>> t = X()
  2. >>> t.control
  3. 10
  4. >>> t.control = 100
  5. >>> t.control
  6. 100
  7. >>> del t.control
  8. >>> t.control
  9. Traceback (most recent call last):
  10.   File "<pyshell#5>", line 1, in <module>
  11.     t.control
  12.   File "C:\Users\Administrator\Desktop\draft\test.py", line 8, in __get__
  13.     return self.fget(instance)
  14.   File "C:\Users\Administrator\Desktop\draft\test.py", line 23, in x_get
  15.     return self.__example
  16. AttributeError: 'X' object has no attribute '_X__example'</font>
复制代码

温度转换
运用上面学到的定制一个Temprature类,温度可以在摄氏度和华氏度之间自动转换
  1. class Celcius:
  2.     def __init__(self, value=0):
  3.         self.c_value = float(value)

  4.     def __get__(self,instance,owner):
  5.         return self.c_value

  6.     def __set__(self,instance,value):
  7.         self.c_value = float(value)

  8.         
  9. class Fahrenheit:
  10.     def __init__(self, value=32):
  11.         self.f_value = float(value)

  12.     def __get__(self,instance,owner):
  13.         return (instance.cel)*1.8+32

  14.     def __set__(self,instance,value):
  15.         instance.cel = (float(value)-32)/1.8


  16. class Temperature:
  17.     cel = Celcius()
  18.     fah = Fahrenheit()
复制代码
运行结果:
  1. >>> temp = Temperature()
  2. >>> temp.cel
  3. 0.0
  4. >>> temp.cel = 100
  5. >>> temp.cel
  6. 100.0
  7. >>> temp.fah
  8. 212.0
  9. >>> temp.fah = 100
  10. >>> temp.cel
  11. 37.77777777777778
  12. >>> temp.fah
  13. 100.0
复制代码







评分

参与人数 1鱼币 +7 收起 理由
小甲鱼 + 7

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 18:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表