定制类
Python 特殊方法(Magic Methods)教程
在 Python 中,以双下划线开头和结尾的方法(如 __init__、__str__ 等)被称为"魔法方法"或"特殊方法"。这些方法允许我们自定义类的行为,使其能够更好地融入 Python 的生态系统。本文将详细介绍 Python 中常用的特殊方法及其应用场景。
1. 对象表示方法
__str__ 和 __repr__
这两个方法用于对象的字符串表示:
__str__: 面向用户的友好字符串表示,print(obj)和str(obj)时调用__repr__: 面向开发者的精确表示,在交互式环境直接输入变量名时调用
最佳实践:
__repr__的输出应尽可能包含重建对象所需的信息- 如果只实现一个,优先实现
__repr__,因为__str__会回退到__repr__
2. 迭代器协议
__iter__ 和 __next__
使对象可迭代:
使用:
3. 序列和映射协议
__getitem__, __setitem__, __delitem__
使对象支持下标访问:
现代 Python 中,还可以实现 __len__ 来支持 len() 函数:
4. 属性访问控制
__getattr__ 和 __setattr__
动态处理属性访问:
现代 Python 中,还可以使用 __getattribute__(所有属性访问都会调用它)和 property 装饰器来实现更精细的属性控制。
5. 可调用对象
__call__
使实例可以像函数一样被调用:
使用:
检查对象是否可调用:
6. 上下文管理器协议
__enter__ 和 __exit__
使对象支持 with 语句:
使用:
7. 现代 Python 新增的特殊方法
Python 3.x 引入了一些新的特殊方法:
__bytes__
定义对象如何转换为字节序列
__format__
定义对象如何格式化输出
__class_getitem__ (Python 3.7+)
支持泛型类型提示
最佳实践
- 一致性:特殊方法的实现应与 Python 内置类型的行为一致
- 文档:为特殊方法添加文档字符串,说明其行为
- 性能:特殊方法常被频繁调用,应保持高效
- 异常处理:合理处理边界情况和异常输入
- 组合优于继承:考虑使用组合而非继承来复用功能
总结
Python 的特殊方法提供了强大的类定制能力。通过合理实现这些方法,我们可以创建行为类似于内置类型的自定义类,使代码更加直观和 Pythonic。随着 Python 的发展,特殊方法也在不断演进,建议定期查阅官方文档以获取最新信息。

