0

0

Python魔术方法详解_特殊行为解析【教程】

舞夢輝影

舞夢輝影

发布时间:2025-12-30 13:59:06

|

610人浏览过

|

来源于php中文网

原创

python魔术方法是类中以双下划线开头和结尾的特殊方法,用于实现协议接口,使自定义类支持运算符、遍历、打印、上下文管理等内置行为;其中__new__负责对象创建,__init__负责初始化,__str__和__repr__分别面向用户和开发者,__add__等支持运算符重载,__enter__/__exit__用于资源管理,而__del__不可靠应避免用于关键清理。

python魔术方法详解_特殊行为解析【教程】

Python魔术方法(Magic Methods),也叫双下划线方法(Dunder Methods),是类中以双下划线开头和结尾的特殊方法,比如 __init____str____add__。它们不是用来“炫技”的,而是让自定义类能自然融入Python语法体系——支持 + 运算、for遍历、print打印、len()调用、上下文管理等,本质上是**协议接口**,告诉解释器“你的对象想怎么被使用”。

初始化与构造:__init__ 不是构造器,__new__ 才是

__init__ 负责初始化已创建的对象,它接收的是已经分配好内存的实例;真正负责对象创建(即分配内存)的是 __new__。多数情况下只需重写 __init__,但若需控制实例生成逻辑(如单例、不可变类型、从缓存返回对象),就得干预 __new__

  • __new__(cls, ...) 必须返回一个 cls 类型的实例(通常调用 super().__new__(cls)
  • __init__(self, ...) 无返回值,只做属性赋值或状态设置
  • 如果 __new__ 返回的不是 cls 实例,__init__ 将不会被调用

字符串表示:__str__ vs __repr__,面向人还是面向开发者

__str__ 用于 str(obj)print(obj),目标是可读、友好、适合终端用户;__repr__ 用于 repr(obj) 和交互式环境直接输出,强调明确性、无歧义,最好能“复制粘贴运行后重建对象”。

  • __repr__ 是调试基础,缺省时 Python 会给出类似 <__main__.point object at></__main__.point> 的地址信息
  • __str__ 缺省时自动调用 __repr__,所以务必先实现 __repr__
  • 例如:datetime(2023, 1, 1)__repr__datetime.datetime(2023, 1, 1, 0, 0)__str__'2023-01-01 00:00:00'

运算符重载:让类支持 + - [] == 等操作

通过实现对应魔术方法,你的类就能像内置类型一样参与运算。关键不是“能重载”,而是“是否符合直觉”。比如 __add__ 应该返回新对象而非修改自身(除非明确设计为就地操作,此时用 __iadd__)。

SekoTalk
SekoTalk

商汤科技推出的AI对口型视频创作工具

下载

立即学习Python免费学习笔记(深入)”;

  • __add__(self, other)a + b__iadd__(self, other)a += b
  • __eq__(self, other) 控制 == 行为;注意:不实现 __eq__ 时默认比较身份(id),实现后 != 自动基于 not ==,除非显式定义 __ne__
  • __getitem__(self, key) 支持 obj[key];配合 __len____iter__ 可让对象支持 for 循环和 in 检查

上下文管理与资源清理:__enter__ / __exit__ 和 __del__ 的分工

with 语句依赖 __enter____exit__,用于安全获取/释放资源(如文件、锁、数据库连接)。而 __del__ 是析构方法,在对象被垃圾回收前调用,但它**不可靠、不及时、不推荐用于关键资源释放**。

  • __enter__ 通常返回 self 或所需资源,__exit__ 接收异常三元组,返回 True 可抑制异常
  • __del__ 不保证何时执行(尤其在程序退出时可能跳过),也不能假设其他对象还存在;应优先用 try/finallycontextlib.closing
  • 标准做法:资源获取走 __init__ 或工厂函数,资源释放交由 __exit__ 显式控制

掌握魔术方法不是为了堆砌功能,而是让类的行为更自然、更符合 Pythonic 风格。每个方法都有明确的语义契约,破坏它会让使用者困惑。写之前先问:这个操作对我的类来说,是否有公认的、无歧义的含义?

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

241

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

128

2025.10.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

44

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号