描述符:将某种特殊类型的类的实例指派给另一个类的属性
a类中的属性a.fa,是通过b类来访问、设置、删除的,那么b类就叫属性a.fa的描述符
(用b类描述fa到底是什么样子的)
有时候,某个应用程序可能会有一个相当微妙的需求,需要你设计一些更为复杂的操作来响应(例如每当属性被访问时,你也许想创建一个日志记录)。最好的解决方案就是编写一个用于执行这些“更复杂的操作”的特殊函数,然后指定它在属性被访问时运行。那么一个具有这种函数的对象被称之为描述符.
简言之:描述符就是一个类,一个至少实现 get()、set() 或 delete() 三个特殊方法中的任意一个的类
作用:可以让程序更加优雅,这里有一些说明
__get__(self,instance,owner) # 用于属性访问,返回属性的值
__set__(self,instance,value) # 将属性分配操作中调用,无返回值
__delete__(self,instance,value) # 控制删除操作不返回
举个栗子:
1.定义一个温度类
2.定义两个描述类(描述摄氏度和华氏度两个属性)
3.要求摄氏度与华氏度可以相互转换(即:通过给摄氏度属性赋值,可打印出华氏度属性)
说明:例子中类Temperature的属性cel、属性fah,一两句话描述不清楚,所以借助专门的类来描述
他们,这个类就叫描述符
class Celsius: # 描述类:摄氏度
def __init__(self, value=26.0): #初始化
self.value = float(value)
def __get__(self, instance, owner): # 当类Celsius被获得时调用(cel = Celsius())
return self.value # instance:实例(这里是t);ower:拥有者(这里是Temperature)
def __set__(self, instance, value): # 当类Celsius被设置时调用(cel = Celsius(30))
self.value = float(value) # instance:实例(这里是t);value:具体值
class Fahrenheit: # 描述类:华氏度
def __get__(self, instance, owner): # 当类Celsius被获得时调用(fah = Fahrenheit())
return instance.cel * 1.8 + 32 # instance:实例(这里是t);ower:拥有者(这里是Temperature)
def __set__(self, instance, value): # 当类Celsius被设置时调用(fah = Fahrenheit(100))
instance.cel = (float(value) - 32) / 1.8 # instance:实例(这里是t);value:具体值
class Temperature: # 温度类:拥有Celsius和Fahrenheit两个描述符
cel = Celsius()
fah = Fahrenheit()
运行:
t = Temperature()
print(t.cel)
结果:
26.0
运行:
t = Temperature()
t.cel = 30
print(t.fah)
结果:
86.0
运行:
t = Temperature()
t.fah = 100 # fah赋值:自动执行Fahrenheit:__set__;instance.cel = (float(value) - 32) / 1.8
# 这里的instance.cel等价于t.cel,是对cel赋值:自动执行Celsius:__set__:self.value = float(value)
# 对t.cel赋予了新的值37.7777
print(t.cel) # 访问t.cel:自动执行Celsius:__get__return self.value
结果:
37.77777777777778