1、描述符
用一个类来描述另一个类的属性,而描述这个属性的类必须实现__get__ __set__ __delete__ 其中一个魔法方法,那么这个描述属性的类被称为描述符
简而言之,描述符就是将某种特殊类型(包含__get__ __set__ __delete__)的类指派给另一个类的属性
2、魔法方法
__get__(self,instance,owner)# owner 是包含描述符的类, instance 是包含描述符的类实例化的对象
用于访问属性,返回属性的值
__set__(self,instance,value)
用于属性分配操作中调用,不返回任何值
__delete__(self,instance)
定义描述符值被删除的行为,不返回值
例子:定义一个温度类,使用描述符,实现摄氏度和华氏度的任意转换
classCelsius:def __init__(self,value=26.0):
self.value=valuedef __get__(self,instance,owner):#print(self,instance,owner)
returnself.valuedef __set__(self,instance,value):
self.value=valueclassFahrenheit:def __get__(self,instance,owner):#print(instance)
return instance.cel*1.8+32
#instance时Temperature实例化的对象a,owner为Temperature这个类
def __set__(self,instance,value):
instance.cel=(value-32)/1.8
classTemperature:
cel=Celsius()
fah=Fahrenheit()
a=Temperature()
定义一个描述符Record描述符,记录指定变量读取和写入操作并保存为文件record.txt
importtimeimportosclassRecord:def __init__(self,value,name):
os.chdir(os.getcwd())
self._value=value
self._name=namedef __get__(self,instance,owner):
file=open('record.txt','a')
TIM=time.strftime("%c")
file.write('%s 变量于北京时间 %s 被读取, %s = %d\n'%(self._name,TIM,self._name,self._value))
file.close()returnself._valuedef __set__(self,instance,value):
self._value=value
file=open('record.txt','a')
TIM=time.strftime("%c")
file.write('%s 变量于北京时间 %s 被修改, %s = %s\n'%(self._name,TIM,self._name,self._value))
file.close()classTest:
x= Record(10,'x')
y= Record(8.8,'y')
test=Test()
定义一个描述符MyDes描述符,用pkl文件来存储相应属性,属性被删除时文件也被删除
importpickle as pimportosclassMyDes:
save=[]def __init__(self, name):
os.chdir(os.curdir)
self._name=namedef __get__(self,instance,owner):if self._name not inself.save:raise AttributeError("%s属性还没赋值"%self._name)else:returnself.valuedef __set__(self,instance,value):
self.save.append(self._name)
self.value=value
file=open((self._name+'.pkl'),'wb')
p.dump(value,file)
file.close()def __delete__(self,instance):
os.remove((self._name+'.pkl'))
self.save.remove(self._name)classTest:
x= MyDes('x')
y= MyDes('y')
test=Test()
来源:oschina
链接:https://my.oschina.net/u/4281883/blog/4233240