Python 魔术方法

发布时间:2026/8/25 6:54:53

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

相关新闻

混合检索技术在大模型面试中的核心应用与调优

混合检索技术在大模型面试中的核心应用与调优

2026/8/25 6:54:53

1. 混合检索技术在大模型面试中的核心地位京东这类头部互联网企业的大模型面试题,往往聚焦行业最前沿的实战需求。混合检索作为RAG(Retrieval-Augmented Generation)系统的核心组件,其调参能力直接决定了知识召回质量。我在实际项…

2026年Java后端面试趋势与核心考察点解析

2026年Java后端面试趋势与核心考察点解析

2026/8/25 6:54:53

1. 2026年Java后端面试趋势与核心考察点2026年的Java后端开发岗位面试已经呈现出明显的技术分层趋势。根据近期的面试反馈和一线大厂的招聘要求,我们可以清晰地看到几个关键变化点:首先是基础知识的考察更加深入。JVM原理不再停留在简单的内存模型和垃圾…

直播平台实时图片审核:从截帧到预警的完整架构与工程实践

直播平台实时图片审核:从截帧到预警的完整架构与工程实践

2026/8/25 6:54:53

1. 从“事后封禁”到“实时拦截”:直播图片审核的痛点与演进直播平台的运营团队,每天都要面对海量的实时视频流。在这些流动的画面中,除了主播的才艺展示和商品讲解,也潜藏着违规图片的风险——无论是主播无意中展示的违禁品、敏感…

符号表--01---概述与实现

符号表--01---概述与实现

2026/8/25 7:44:56

符号表 定义: 符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。符号表中,键具有唯一性。使用场景: 符号表在实际生活中的使用场景是非常广泛…

I2C协议进阶:快速模式、高速模式与10位寻址详解

I2C协议进阶:快速模式、高速模式与10位寻址详解

2026/8/25 7:44:56

1. 从标准模式到性能跃迁:为什么需要更快的I2C?搞嵌入式开发的朋友,对I2C(Inter-Integrated Circuit)协议肯定不陌生。它那两根线(SDA数据线、SCL时钟线)的简洁设计,让连接多个低速外…

Mendeley文献管理实战:从高效导入到精准引用,打造个人学术知识库

Mendeley文献管理实战:从高效导入到精准引用,打造个人学术知识库

2026/8/25 7:44:56

1. 从文献混乱到高效管理:为什么我坚持用Mendeley如果你和我一样,每天需要和几十甚至上百篇PDF文献打交道,那你一定经历过这种痛苦:电脑桌面或下载文件夹里堆满了以“paper1_final_revised.pdf”这种毫无意义命名的文件&#xff1…

Mendeley文献管理工具:从入门到精通,打造高效学术工作流

Mendeley文献管理工具:从入门到精通,打造高效学术工作流

2026/8/25 7:44:56

1. 从文献混乱到高效管理:为什么你需要Mendeley如果你正在读研、搞科研,或者从事任何需要大量阅读和引用文献的工作,那么你肯定对下面这个场景不陌生:电脑里塞满了从各个数据库下载的PDF文件,文件名千奇百怪&#xff0…

树--05---二叉树--02---二叉搜索树(BST)遍历

树--05---二叉树--02---二叉搜索树(BST)遍历

2026/8/25 7:44:56

文章目录二叉树(BST)基础遍历----深度优先1. 前序遍历前序遍历的API实现步骤:用的jDK自带的队列 LinkedBlockingDeque代码:测试2.中序遍历中序遍历是按照Key从小到大遍历,最为重要中序遍历的API:实现步骤:代码:测试:3.…

STM32外部中断按键处理:从HAL库配置到状态机消抖实战

STM32外部中断按键处理:从HAL库配置到状态机消抖实战

2026/8/25 7:34:55

1. 项目概述:从轮询到中断,按键处理的效率革命在嵌入式开发里,按键检测是基础得不能再基础的功能,但恰恰是这个基础功能,最能体现一个开发者对系统资源利用的理解深度。很多新手,包括当年的我,都…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/24 19:53:32

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/24 19:56:07

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/24 21:16:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

2026/8/25 0:04:34

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description:GetQzonehistory 是一个QQ空间历史说…

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

2026/8/25 0:04:35

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

2026/8/25 0:04:35

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…