flash个人网站模板如何修改用织梦做的网站的模板
flash个人网站模板,如何修改用织梦做的网站的模板,济南网络推广,软件开发就业前景如何Python 中的代理模式#xff08;Proxy Pattern#xff09;
代理模式是一种结构型设计模式#xff0c;其核心目的是#xff1a; 为另一个对象提供一个替身或占位符#xff08;代理#xff09;#xff0c;以控制对这个对象的访问。
形象比喻#xff1a;就像明星的经纪人…Python 中的代理模式Proxy Pattern代理模式是一种结构型设计模式其核心目的是为另一个对象提供一个替身或占位符代理以控制对这个对象的访问。形象比喻就像明星的经纪人——粉丝想找明星只能通过经纪人代理联系经纪人可以筛选、记录、延迟或增强请求。代理模式的四种常见类型虚拟代理Virtual Proxy延迟加载懒加载只有真正需要时才创建真实对象节省资源。远程代理Remote Proxy代表网络另一端的对象RPC、Web Service。保护代理Protection Proxy根据权限控制对真实对象的访问。智能代理Smart Proxy在访问对象时添加额外行为如计数、日志、缓存。Python 实现示例1. 虚拟代理懒加载—— 最常见场景适用于加载代价高昂的对象如大图片、数据库连接、复杂计算。classImage:def__init__(self,filename):self.filenamefilenameprint(f加载图片{filename}这可能很慢)# 模拟耗时加载importtime time.sleep(2)# 模拟 IO 延迟defdisplay(self):print(f显示图片:{self.filename})classProxyImage:def__init__(self,filename):self.filenamefilename self._real_imageNone# 延迟创建defdisplay(self):ifself._real_imageisNone:self._real_imageImage(self.filename)# 真正需要时才加载self._real_image.display()# 使用if__name____main__:image1ProxyImage(photo1.jpg)image2ProxyImage(photo2.jpg)print(代理创建完成但图片还未加载)image1.display()# 第一次调用真正加载并显示image1.display()# 第二次直接显示已缓存image2.display()# 加载并显示输出代理创建完成但图片还未加载 加载图片 photo1.jpg这可能很慢 显示图片: photo1.jpg 显示图片: photo1.jpg 加载图片 photo2.jpg这可能很慢 显示图片: photo2.jpg2. 保护代理权限控制classSensitiveData:def__init__(self):self.data超级机密信息银行账户 123456789defread(self):print(f读取数据:{self.data})defwrite(self,new_data):print(f写入数据:{new_data})self.datanew_dataclassProtectionProxy:def__init__(self,real_subject:SensitiveData,user_role:str):self._real_subjectreal_subject self._user_roleuser_roledefread(self):ifself._user_rolein[admin,user]:self._real_subject.read()else:print(权限不足无法读取)defwrite(self,new_data):ifself._user_roleadmin:self._real_subject.write(new_data)else:print(权限不足只有管理员可写)# 使用dataSensitiveData()proxy_adminProtectionProxy(data,admin)proxy_userProtectionProxy(data,user)proxy_guestProtectionProxy(data,guest)proxy_admin.read()# 允许proxy_admin.write(新数据)# 允许proxy_user.read()# 允许proxy_user.write(尝试修改)# 拒绝proxy_guest.read()# 拒绝3. 智能代理日志 缓存classExpensiveComputation:defcompute(self,x):print(f执行昂贵计算 for{x}...)importtime time.sleep(1)returnx**xclassSmartProxy:def__init__(self):self._realExpensiveComputation()self._cache{}# 缓存结果defcompute(self,x):print(f[代理] 请求计算{x})ifxnotinself._cache:self._cache[x]self._real.compute(x)print(f[代理] 缓存新结果)else:print(f[代理] 从缓存返回)returnself._cache[x]# 使用proxySmartProxy()print(proxy.compute(5))# 真正计算print(proxy.compute(5))# 缓存命中print(proxy.compute(10))# 真正计算代理模式结构总结角色说明Subject公共接口Image / SensitiveDataRealSubject真实对象Proxy代理对象控制访问、添加行为Client使用 Subject 接口的代码代理模式 vs 装饰器模式 vs 适配器模式模式目的是否持有真实对象是否改变接口代理控制访问懒加载、权限、日志是不改变装饰器增强功能添加职责是不改变适配器转换接口是改变关键区别代理和装饰器都保持接口不变但代理更注重“控制访问”装饰器更注重“增强行为”。代理常用于资源管理、权限、安全装饰器常用于功能叠加。Python 中的实际应用场景Web 框架中的数据库连接代理连接池ORM 中的懒加载属性如 SQLAlchemy 的关系字段缓存代理如 Redis 缓存代理API 客户端的认证代理自动添加 token文件访问代理权限检查Pythonic 简化方式很多时候可以用属性描述符property或第三方库实现代理classLazyProperty:def__init__(self,func):self.funcfuncdef__get__(self,obj,cls):ifobjisNone:returnself valueself.func(obj)setattr(obj,self.func.__name__,value)# 缓存returnvalueclassBigObject:LazyPropertydefheavy_data(self):print(加载大数据...)return{data:very large}objBigObject()print(创建对象)print(obj.heavy_data)# 第一次加载print(obj.heavy_data)# 第二次直接返回总结建议使用代理模式当你需要控制访问、延迟加载、添加安全检查时。优先使用对象组合实现代理Python 推荐。不要滥用如果只是增强功能考虑装饰器如果是接口转换用适配器。如果你想看更高级的例子如远程代理模拟、结合 asyncio 的异步代理、缓存代理实现或者与其他模式对比的实际项目案例欢迎继续问