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()
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 提示词工程师自白:我如何用一个技巧解放自己的生产力
· 一文搞懂MCP协议与Function Call的区别
· 如何不购买域名在云服务器上搭建HTTPS服务