Python 中的魔术方法(Magic Methods)
一、核心概念
- 命名规范:
__xxx__
(双下划线包围,如 __init__
) - 自动调用:由 Python 解释器在特定时机调用,而非用户手动调用。
- 目的:让自定义类支持运算符、内置函数、迭代、上下文管理等高级特性。
- 别名:Magic Methods / Dunder Methods(Double UNDERscore)
二、常用魔术方法分类详解
1. 对象构造与析构
方法 | 说明 | 示例 |
__new__(cls, ...) | 创建对象实例(先于 __init__ ),用于控制对象创建过程,常用于单例模式或不可变类型。 | 见下方示例 |
__init__(self, ...) | 初始化对象,构造函数,设置实例属性。 | def __init__(self, name): self.name = name |
__del__(self) | 析构函数,对象被销毁时调用(不保证立即执行,依赖垃圾回收)。慎用! | def __del__(self): print("对象被销毁") |
__new__
示例(单例模式)
class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instancedef __init__(self, value):self.value = values1 = Singleton(10)
s2 = Singleton(20)
print(s1 is s2)
print(s1.value)
⚠️ 注意:__new__
是静态方法,第一个参数是 cls
;__init__
是实例方法,第一个参数是 self
。
2. 对象表示与字符串
方法 | 说明 | 示例 |
__str__(self) | str(obj) 或 print(obj) 时调用,返回用户友好的字符串。 | return f"Person: {self.name}" |
__repr__(self) | repr(obj) 或交互式解释器中直接输入对象时调用,返回开发者友好、无歧义的字符串,理想情况下应能 eval 重建对象。 | return f"Person('{self.name}', {self.age})" |
__format__(self, format_spec) | 支持 format(obj, spec) 或 f-string 格式化。 | 见下方示例 |
__str__
vs __repr__
示例
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"{self.name}, {self.age}岁"def __repr__(self):return f"Person(name='{self.name}', age={self.age})"p = Person("Alice", 30)
print(p)
print(repr(p))
__format__
示例
class Temperature:def __init__(self, celsius):self.celsius = celsiusdef __format__(self, spec):if spec == "f":return f"{self.celsius * 9/5 + 32:.1f}°F"elif spec == "k":return f"{self.celsius + 273.15:.1f}K"else:return f"{self.celsius:.1f}°C"temp = Temperature(25)
print(f"{temp}")
print(f"{temp:f}")
print(f"{temp:k}")