什么是描述器?
描述器(Descriptors):一个有”绑定行为”的对象属性(object attribute),它的属性访问被描述器协议方法重写,可以理解为将某种特殊类型的类的实例指派给另一个类的属性。如下:
class A(object):
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 Text(object):
x = A()
test = Text()
print(test.x)
print(A())
print(test)
print(Text)
运行结果:
getting... <__main__.A object at 0x000002906CE30668> <__main__.Text object at 0x000002906CE30588> <class '__main__.Text'>
0
<__main__.A object at 0x000002906CE309E8>
<__main__.Text object at 0x000002906CE30588>
<class '__main__.Text'>
描述符有以下三个属性: get(self,instance,owner):用于访问属性,返回属性的值,当你进行访问时,自动调用。 set(self,instance,value):将在属性中分配操作中调用,不返回任何内容,当你进行赋值时,自动调用。 delete(self,instance):控制删除操作,不返回任何内容,当你进行删除时,自动调用。
在我们学习描述器之前,大家应该都知道property(fget= None,fset= None,fdel =Node,doc =Node)属性, 其实他就是一个描述器。
描述器练习
class Celsius(object):
def __init__(self, cel=0):
self.value = cel
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 = 40
print(temp.cel)
运行结果:
86.0
4.444444444444445
|