描述符: 将某种特殊类型的类的实例指派给另一个类的属性
特殊类型:实现了以下三个方法中至少一个
__get__(self, instance, owner) 用于访问属性,返回属性的值
__set__(self, instance, value) 将在属性分配操作中调用,不返回任何内容
__delete__(self, instance) 控制删除操作,不返回任何内容
以上三个方法虽然跟getattr setattr 以及deleteattr很相似,但是这三个方法属于描述符属性的方法。
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("setting...", self, instance)
class Test:
x = MyDecriptor()
test = Test()
test.x
通过运行,可以分别知道self, instance, owner的值,这对于后期灵活运用描述符有着重要的作用.
运行结果:
getting... <testDes.MyDecriptor object at 0x0000021FECD88A20> <testDes.Test object at 0x0000021FECD97048> <class 'testDes.Test'>
实践:
定义一个温度类,然后定义两个描述符类用于描述摄氏度和华氏度两个属性。 要求两个属性会自动进行转换,也就是说您可以给摄氏度这个属性赋值,然后打印的华氏度属性是自动转换后的结果。
最终代码如下:
class Celsius:
def __init_(self, value = 26.0):
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 Temperature:
cel = Celsius()
fah = Fahrenheit()
temp = Temperature()
temp.cel = 30
print(temp.fah)
temp.fah = 100
print(temp.cel)