恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Python 魔术方法

  • 首页
  • 资讯中心
  • /
  • Python 魔术方法

相关资讯

OpenClaw/QClaw:极简AI智能体框架的架构解析与实战部署 2026/8/25 6:49:16
AI芯片架构大揭秘:英伟达GPU与谷歌TPU的设计、扩展及软件全解析 2026/8/25 6:49:16
腾讯开源WeKnora:企业级RAG框架的模块化设计与工程实践 2026/8/25 6:49:16

最新资讯

LangChain Agent集成MCP与Skills:构建动态扩展的AI智能体
企业级广告营销自动化:OpenClaw如何实现安全隔离与成本治理
8.23华为OD机试真题 新系统 - 直线冲刺(Java/Py/C/C++/Js/Go)
LeetCode 598 区间加法 II:从暴力模拟到数学最优解,掌握区间覆盖问题核心
构建个人韧性收入系统:风险对冲与现金流管理的实战策略
OpenClaw:42个AI技能协同的智能体操作系统实战解析

今日推荐

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南
洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表
Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

本周热门

Nextcloud 桌面客户端:把同步交给它,你只管改文件
如何将 HTML 转成 Word 文档且格式不丢失?html-to-docx 使用教程
Anki 批量操作卡片完整指南:一次搞定上千张,不再逐张修改

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

Python 魔术方法

发布时间:2026/8/25 6:54:17
Python 魔术方法 Python 魔术方法Magic Method / 双下划线方法__xxx__特征前后双下划线__名字__又叫特殊方法。你不要手动直接调用它Python解释器会在特定语法、内置操作触发时自动调用。举个直观例子objobj2# 自动调用 obj.__add__(obj2)print(obj)# 自动调用 obj.__str__()len(obj)# 自动调用 obj.__len__()withobj:# 自动调用 __enter__ / __exit__forxinobj:# 自动调用 __iter__ / __next__对比 Swift相当于 Swift 的customDebugDescription、运算符重载、Sequence协议Python靠魔术方法Swift靠协议扩展。一、基础常用魔术方法1. 实例生命周期__new__(cls, *args, **kwargs)创建对象实例分配内存类方法先执行。几乎很少重写。__init__(self, ...)初始化实例大家最熟。obj A()→ 先__new__得到空对象再调用__init__给属性赋值。❗注意__init__不创建对象只是初始化。__del__(self)对象被垃圾回收销毁时触发。不要用来做资源释放不可预测什么时候执行资源释放优先用上下文管理器__enter__/__exit__不要靠__del__。classDemo:def__init__(self,name):self.namenameprint(f__init__ 初始化{self.name})dDemo(aaa)2. 字符串打印__str__(self)str(obj)/print(obj)面向人阅读的字符串。__repr__(self)repr(obj)调试、控制台输出面向开发者理想状态可以eval复原对象。classUser:def__init__(self,name):self.namenamedef__str__(self):returnf用户{self.name}def__repr__(self):returnfUser(name{self.name})uUser(张三)print(u)# __str__ → 用户张三print(repr(u))# __repr__ → User(name张三)3. 长度、下标访问容器类__len__(self)len(obj)触发必须返回int__getitem__(self, key)obj[key]获取__setitem__(self, key, val)obj[key] val赋值__delitem__(self, key)del obj[key]删除classMyList:def__init__(self):self.data[10,20,30]def__len__(self):returnlen(self.data)def__getitem__(self,idx):returnself.data[idx]mlMyList()print(len(ml))# 调用 __len__print(ml[1])# 调用 __getitem__4. 上下文管理器就是刚才 with__enter__(self)进入with块执行返回值赋值给as 变量__exit__(self, exc_type, exc_val, exc_tb)退出with块无论是否异常一定执行。classCtx:def__enter__(self):print(进入)returnselfdef__exit__(self,et,ev,tb):print(退出不管有没有报错都跑)withCtx()asc:passasync协程上下文管理器__aenter__、__aexit__配合async with。5. 迭代器相关 for in__iter__(self)for x in obj返回迭代器对象__next__(self)迭代取下一个无数据抛StopIterationclassCounter:def__iter__(self):self.n0returnselfdef__next__(self):ifself.n3:raiseStopIteration vself.n self.n1returnvforiinCounter():print(i)6. 运算符重载__add__(self,other)# __sub__(self,other)# -__mul__(self,other)# *__eq__(self,other)# __lt__(self,other)# 示例classPoint:def__init__(self,x,y):self.xx self.yydef__add__(self,other):returnPoint(self.xother.x,self.yother.y)def__eq__(self,other):returnself.xother.xandself.yother.y p1Point(1,2)p2Point(3,4)p3p1p2# 触发 __add__print(p3.x,p3.y)print(p1p2)#触发 __eq__7. 可调用对象__call__让实例本身可以像函数一样加括号调用obj()。classCalc:def__call__(self,a,b):returnab cCalc()resc(2,3)# 调用 __call__print(res)#5二、容易混淆的点不要手动调用魔术方法❌ 不要写obj.__str__()✅写str(obj)。解释器帮你调用。魔术方法是定义类行为的协议只要你实现对应的双下划线方法Python语法、内置函数就知道该怎么处理你的自定义对象。类比Swift实现协议就获得对应语法能力。Swift: 遵守CustomStringConvertible→ 获得print能力Python: 实现__str__魔术方法 → 获得print能力不是所有双下划线都是魔术方法实例变量self.__abc这是名称改写name mangling私有变量不是魔术方法classA:def__init__(self):self.__secret100# 私有属性不是魔术方法魔术方法是类里面定义的函数def __xxx__(self):。实例属性前后双下划线不算。三、高频速查表魔术方法触发时机__init__obj Cls()实例初始化__str__print(obj) / str(obj)__repr__调试repr(obj)__len__len(obj)__getitem__obj[key]__setitem__obj[key]val__enter__ / __exit__with obj:上下文管理器__aenter__ / __aexit__async with obj:异步上下文__iter__ / __next__for x in obj循环迭代__call__obj()对象当做函数调用__add__/__eq__、运算符四、举个完整小例子上下文管理器类复习刚才withclassMyLock:def__enter__(self):print(加锁)returnselfdef__exit__(self,exc_type,exc_val,exc_tb):print(释放锁异常也会执行)# 返回False异常向外抛出returnFalsewithMyLock():print(临界区执行)threading.Lock之所以支持with就是它内部已经实现了__enter__、__exit__魔术方法。五、和Swift简单对照理解Python魔术方法Swift等价机制__str__CustomStringConvertible__iter__/__next__Sequence、IteratorProtocol__add__运算符重载static func with(__enter__/__exit__)没有语法用defer手动实现释放逻辑__call__callAsFunction

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号