news 2026/1/11 18:35:55

Python 代理模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 代理模式

Python 中的代理模式(Proxy Pattern)

代理模式是一种结构型设计模式,其核心目的是:
为另一个对象提供一个替身或占位符(代理),以控制对这个对象的访问

形象比喻:就像明星的经纪人——粉丝想找明星,只能通过经纪人(代理)联系,经纪人可以筛选、记录、延迟或增强请求。

代理模式的四种常见类型
  1. 虚拟代理(Virtual Proxy):延迟加载(懒加载),只有真正需要时才创建真实对象(节省资源)。
  2. 远程代理(Remote Proxy):代表网络另一端的对象(RPC、Web Service)。
  3. 保护代理(Protection Proxy):根据权限控制对真实对象的访问。
  4. 智能代理(Smart Proxy):在访问对象时添加额外行为(如计数、日志、缓存)。
Python 实现示例
1. 虚拟代理(懒加载)—— 最常见场景

适用于加载代价高昂的对象(如大图片、数据库连接、复杂计算)。

classImage:def__init__(self,filename):self.filename=filenameprint(f"加载图片{filename}(这可能很慢!)")# 模拟耗时加载importtime time.sleep(2)# 模拟 IO 延迟defdisplay(self):print(f"显示图片:{self.filename}")classProxyImage:def__init__(self,filename):self.filename=filename self._real_image=None# 延迟创建defdisplay(self):ifself._real_imageisNone:self._real_image=Image(self.filename)# 真正需要时才加载self._real_image.display()# 使用if__name__=="__main__":image1=ProxyImage("photo1.jpg")image2=ProxyImage("photo2.jpg")print("代理创建完成,但图片还未加载")image1.display()# 第一次调用:真正加载并显示image1.display()# 第二次:直接显示,已缓存image2.display()# 加载并显示

输出

代理创建完成,但图片还未加载 加载图片 photo1.jpg(这可能很慢!) 显示图片: photo1.jpg 显示图片: photo1.jpg 加载图片 photo2.jpg(这可能很慢!) 显示图片: photo2.jpg
2. 保护代理(权限控制)
classSensitiveData:def__init__(self):self.data="超级机密信息:银行账户 = 123456789"defread(self):print(f"读取数据:{self.data}")defwrite(self,new_data):print(f"写入数据:{new_data}")self.data=new_dataclassProtectionProxy:def__init__(self,real_subject:SensitiveData,user_role:str):self._real_subject=real_subject self._user_role=user_roledefread(self):ifself._user_rolein["admin","user"]:self._real_subject.read()else:print("权限不足:无法读取")defwrite(self,new_data):ifself._user_role=="admin":self._real_subject.write(new_data)else:print("权限不足:只有管理员可写")# 使用data=SensitiveData()proxy_admin=ProtectionProxy(data,"admin")proxy_user=ProtectionProxy(data,"user")proxy_guest=ProtectionProxy(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._real=ExpensiveComputation()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]# 使用proxy=SmartProxy()print(proxy.compute(5))# 真正计算print(proxy.compute(5))# 缓存命中print(proxy.compute(10))# 真正计算
代理模式结构总结
角色说明
Subject公共接口(Image / SensitiveData)
RealSubject真实对象
Proxy代理对象,控制访问、添加行为
Client使用 Subject 接口的代码
代理模式 vs 装饰器模式 vs 适配器模式
模式目的是否持有真实对象是否改变接口
代理控制访问(懒加载、权限、日志)不改变
装饰器增强功能(添加职责)不改变
适配器转换接口改变

关键区别

  • 代理和装饰器都保持接口不变,但代理更注重“控制访问”,装饰器更注重“增强行为”。
  • 代理常用于资源管理、权限、安全;装饰器常用于功能叠加。
Python 中的实际应用场景
  • Web 框架中的数据库连接代理(连接池)
  • ORM 中的懒加载属性(如 SQLAlchemy 的关系字段)
  • 缓存代理(如 Redis 缓存代理)
  • API 客户端的认证代理(自动添加 token)
  • 文件访问代理(权限检查)
Pythonic 简化方式

很多时候可以用属性描述符(@property)或第三方库实现代理:

classLazyProperty:def__init__(self,func):self.func=funcdef__get__(self,obj,cls):ifobjisNone:returnself value=self.func(obj)setattr(obj,self.func.__name__,value)# 缓存returnvalueclassBigObject:@LazyPropertydefheavy_data(self):print("加载大数据...")return{"data":"very large"}obj=BigObject()print("创建对象")print(obj.heavy_data)# 第一次加载print(obj.heavy_data)# 第二次直接返回
总结建议
  • 使用代理模式当你需要控制访问、延迟加载、添加安全检查时。
  • 优先使用对象组合实现代理(Python 推荐)。
  • 不要滥用:如果只是增强功能,考虑装饰器;如果是接口转换,用适配器。

如果你想看更高级的例子(如远程代理模拟、结合 asyncio 的异步代理、缓存代理实现),或者与其他模式对比的实际项目案例,欢迎继续问!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/25 9:50:08

Python 桥接模式

Python 中的桥接模式(Bridge Pattern) 桥接模式是一种结构型设计模式,其核心目的是: 将抽象部分(Abstraction)与实现部分(Implementation)分离,使它们可以独立变化。 形…

作者头像 李华
网站建设 2025/12/25 9:50:04

Charticulator图表定制完整指南:零代码打造专业数据可视化

Charticulator图表定制完整指南:零代码打造专业数据可视化 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 还在为制作个性化图表而烦恼吗&#xff1f…

作者头像 李华
网站建设 2026/1/11 7:12:05

探索FreeRedis:重新定义.NET环境下的Redis客户端体验

探索FreeRedis:重新定义.NET环境下的Redis客户端体验 【免费下载链接】FreeRedis 项目地址: https://gitcode.com/gh_mirrors/fr/FreeRedis 你是否曾为Redis客户端的性能瓶颈而困扰?在资源受限的环境中,传统的Redis客户端往往显得过于…

作者头像 李华
网站建设 2025/12/25 9:49:45

南信大本科论文排版快速上手终极方案:告别格式烦恼的智能模板

还在为毕业论文格式调整而熬夜奋战吗?南京信息工程大学本科生毕业论文LaTeX模板正是为你量身打造的排版利器。这款专为南信大学子设计的智能工具,能够自动处理所有繁琐的格式要求,让你专注内容创作,轻松搞定万字论文。 【免费下载…

作者头像 李华
网站建设 2025/12/25 9:49:07

【Open-AutoGLM远程调试终极指南】:掌握高效排查技巧,提升AI开发效率

第一章:Open-AutoGLM远程调试概述Open-AutoGLM 是一个面向自动化生成式语言模型任务的开源框架,支持本地与远程协同调试机制,极大提升了开发效率与部署灵活性。通过内置的远程调试接口,开发者可在分布式环境中实时监控模型推理流程…

作者头像 李华