今天主要说一下描述符的原理,基于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.x
test.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=30
print(temp.fah)
print(temp.cel)
在这段到代码中分别定义了两个特殊类Celsius和Fahrenheit,然后Temperature类中将上述两个特殊类的实例化对象赋值给了Temprature的两个属性,通过对这两个属性的操作,实现对代码的重用。而且使用描述符对于代码程序的修改也非常方便。
关于描述符的学习就先到这,之后有了更深一步的了解会进一步的补充。