🐍
Python 魔术方法
Python 双下划线魔术方法速查。
本地处理 · 不上传
加载工具中…
相关:python · 魔术方法 · dunder · magic
Python 魔术方法列出双下划线方法的作用与触发时机,涵盖构造、运算符重载、上下文管理与迭代协议。
使用步骤
- 先确定要定制的是构造、比较、迭代还是上下文管理
- 找到对应的魔术方法名
- 按约定实现返回值类型,比如 __eq__ 返回布尔
- 实现 __eq__ 时通常要一并实现 __hash__
使用场景
- 实现自定义类的行为
- 理解某个魔术方法何时被调用
- 实现迭代器与上下文管理器
- 阅读他人代码时查阅
小贴士
- __str__ 面向用户、__repr__ 面向开发者。只定义一个的话应优先定义 __repr__,因为它会作为 __str__ 的后备。
- 实现 __enter__ 与 __exit__ 即可用于 with 语句,这是管理资源(文件、连接、锁)最可靠的方式。
- __eq__ 与 __hash__ 应当同时定义并保持一致,只改其中一个会破坏字典与集合的正确性。
常见问题
__str__ 和 __repr__ 有什么区别?
__str__ 面向最终用户,追求可读;__repr__ 面向开发者,应尽量能还原对象(理想情况下 eval 它能重建对象)。只定义 __repr__ 时,print 会自动回退使用它。
怎么让类支持 with 语句?
实现 __enter__ 与 __exit__ 两个方法。前者返回 with 语句中绑定的对象,后者负责清理。即便代码块中抛出异常,__exit__ 也一定会被调用,这是它比手工 try/finally 更可靠的原因。
为什么改了 __eq__ 对象就不能放进集合了?
因为定义 __eq__ 后 Python 会把 __hash__ 设为 None,使对象变为不可哈希。若需要放进集合或作字典键,必须同时定义 __hash__,且保证相等的对象哈希值也相等。
Python 魔术方法是免费的吗?
是。本站所有工具完全免费,无需注册登录、无广告干扰,打开即用。
使用Python 魔术方法,我的数据安全吗?
安全。该工具在你的浏览器本地完成处理,输入内容不会上传到服务器,隐私更有保障。