Python3魔法方法:描述符(property的实现原理)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python3魔法⽅法:描述符(property的实现原理)1、描述符
⽤⼀个类来描述另⼀个类的属性,⽽描述这个属性的类必须实现__get__ __set__ __delete__ 其中⼀个魔法⽅法,那么这个描述属性的类被称为描述符简⽽⾔之,描述符就是将某种特殊类型(包含__get__ __set__ __delete__)的类指派给另⼀个类的属性
2、魔法⽅法
__get__(self,instance,owner)# owner 是包含描述符的类, instance 是包含描述符的类实例化的对象
⽤于访问属性,返回属性的值
__set__(self,instance,value)
⽤于属性分配操作中调⽤,不返回任何值
__delete__(self,instance)
定义描述符值被删除的⾏为,不返回值
例⼦:定义⼀个温度类,使⽤描述符,实现摄⽒度和华⽒度的任意转换
class Celsius:
def__init__(self,value=26.0):
self.value=value
def__get__(self,instance,owner):
#print(self,instance,owner)
return self.value
def__set__(self,instance,value):
self.value=value
class Fahrenheit:
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
class Temperature:
cel=Celsius()
fah=Fahrenheit()
a=Temperature()
定义⼀个描述符Record描述符,记录指定变量读取和写⼊操作并保存为⽂件record.txt
import time
import os
class Record:
def__init__(self,value,name):
os.chdir(os.getcwd())
self._value=value
self._name=name
def__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()
return self._value
def__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()
class Test:
x = Record(10,'x')
y = Record(8.8,'y')
test=Test()
定义⼀个描述符MyDes描述符,⽤pkl⽂件来存储相应属性,属性被删除时⽂件也被删除
import pickle as p
import os
class MyDes:
save=[]
def__init__(self, name):
os.chdir(os.curdir)
self._name=name
def__get__(self,instance,owner):
if self._name not in self.save:
raise AttributeError("%s属性还没赋值"%self._name)
else:
return self.value
def__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)
class Test:
x = MyDes('x')
y = MyDes('y')
test=Test()。

相关文档
最新文档