四、魔法方法学习笔记
2026-02-21
Python基础
type
Post
status
Published
date
Feb 21, 2026
slug
python-magic-method-learning-notes-4
summary
__init__ 很神奇,不用调用就能执行。后来才知道,这种双下划线开头结尾的方法叫"魔法方法",它们让对象可以像内置类型一样使用,比如用 + 号相加、用 print 直接输出!tags
category
Python基础
icon
password
💡 学习感悟:__init__很神奇,不用调用就能执行。后来才知道,这种双下划线开头结尾的方法叫"魔法方法",它们让对象可以像内置类型一样使用,比如用+号相加、用
1. 什么是魔法方法?
魔法方法(Magic Methods)是双下划线开头结尾的特殊方法,在特定情况下自动调用。
📝 我的理解:魔法方法就像是自动触发器——满足条件时自动执行,不需要手动调用。
2. 构造与析构
2.1 init 构造方法
📝 我的理解:__init__就像是新房装修——房子建好了,自动进行装修(初始化)。
2.2 del 析构方法
📝 我的理解:__del__就像是退房清理——离开房间时自动打扫、关闭水电。
3. 字符串表示
3.1 str 用户友好字符串
📝 我的理解:__str__就像是名片——给别人看的,要简洁明了。
3.2 repr 开发者字符串
📝 我的理解:__repr__就像是身份证——给开发者看的,要详细准确,最好能直接用来重建对象。
3.3 str vs repr
方法 | 用途 | 调用方式 | 目标用户 |
__str__ | 用户友好 | print(obj), str(obj) | 最终用户 |
__repr__ | 开发者友好 | repr(obj), 交互式解释器 | 开发者 |
💡 建议:至少实现__repr__,如果__str__没定义,会回退到__repr__。
4. 比较方法
4.1 比较运算符
📝 我的理解:比较方法就像是评判标准——定义什么情况下两个对象相等,什么情况下一个大一个小。
4.2 比较方法速查
方法 | 运算符 | 含义 |
__eq__ | == | 等于 |
__ne__ | != | 不等于 |
__lt__ | < | 小于 |
__le__ | <= | 小于等于 |
__gt__ | > | 大于 |
__ge__ | >= | 大于等于 |
5. 算术运算符
5.1 加减乘除
📝 我的理解:算术方法就像是运算符重载——让自定义对象也能用+-*/等运算符。
5.2 算术运算符速查
方法 | 运算符 | 含义 |
__add__ | + | 加法 |
__sub__ | - | 减法 |
__mul__ | * | 乘法 |
__truediv__ | / | 除法 |
__floordiv__ | // | 整除 |
__mod__ | % | 取模 |
__pow__ | ** | 幂运算 |
6. 容器类型方法
6.1 让对象像列表一样使用
📝 我的理解:容器方法就像是模仿秀——让自定义对象也能像列表、字典一样用[]和in。
7. 可调用对象
7.1 call 方法
📝 我的理解:__call__就像是变形金刚——对象可以变成函数的样子,直接加括号调用。
8. 踩坑记录
8.1 只定义 eq 不定义 hash
⚠️ 踩坑:定义了__eq__后,对象默认不可哈希,不能放入set或作为dict的 key!
8.2 修改可变对象返回自身
⚠️ 踩坑:算术运算应该返回新对象,而不是修改自身(除非你想实现+=的__iadd__)!
9. 核心知识点整理
9.1 常用魔法方法速查
类别 | 方法 | 触发条件 |
构造析构 | __init__ | 创建对象 |
ㅤ | __del__ | 删除对象 |
字符串 | __str__ | print(), str() |
ㅤ | __repr__ | repr(), 交互式解释器 |
比较 | __eq__, __ne__ | ==, != |
ㅤ | __lt__, __le__ | <, <= |
ㅤ | __gt__, __ge__ | >, >= |
算术 | __add__, __sub__ | +, - |
ㅤ | __mul__, __truediv__ | *, / |
容器 | __len__ | len() |
ㅤ | __getitem__ | obj[key] |
ㅤ | __setitem__ | obj[key] = value |
ㅤ | __contains__ | in |
可调用 | __call__ | obj() |
9.2 魔法方法命名规则
- 双下划线开头:
__xxx
- 双下划线结尾:
xxx__
- 不要自己发明魔法方法,只用 Python 定义的
Loading...
