Python零基础入门十七之描述符

来源:互联网 发布:引力波被发现 知乎 编辑:程序博客网 时间:2024/06/07 19:37

今天主要说一下描述符的原理,基于property原理,在上一篇博客中已经简单的说了property,今天详细的说一下描述符。
(1)定义
描述符:就是将某种特殊类型的类的实例指派给另一个类的属性
这里的特殊类型的类指的是至少实现了以下方法中的任意一个:

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

通过下面的一段代码来了解一下上述函数以及各个参数的重要含义

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.xtest.x="X-man"del test.x

这里写图片描述

也就是说系统在执行test.x语句的时候,调用了MyDecriptor类中的get方法,根据打印输出的内容再看一下get函数中的三个参数的意义
第一个参数self:指的是MyDecriptor这个类对象本身
第二个参数instance:指的是Test这个类对象
第三个参数owner:这个对象的拥有者
其实根据描述符的定义这段代码也不难理解,描述符类MyDecriptor将
实例化对象赋值给了Test中的属性。这样在Test类中属性x便可以使用特殊类MyDescripor中的方法,实际上实现了代码的重用。

下面通过解决一个现实中的问题来进一步理解描述符,编写一段代码实现摄氏度与华氏度的转变,及输入摄氏度输出对应的华氏度,反之亦然。

class Celsius:     def __init__(self,value=26):          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     def __set__(self,instance,value):          instance.cel=(float(value)-32)/(1.8)class Temprature:     cel=Celsius()     fah=Fahrenheit()temp=Temprature()temp.cel=30print(temp.fah)print(temp.cel)

在这段到代码中分别定义了两个特殊类Celsius和Fahrenheit,然后Temperature类中将上述两个特殊类的实例化对象赋值给了Temprature的两个属性,通过对这两个属性的操作,实现对代码的重用。而且使用描述符对于代码程序的修改也非常方便。

关于描述符的学习就先到这,之后有了更深一步的了解会进一步的补充。

0 0
原创粉丝点击