什么是魔术方法
在 Python 中,魔术方法(Magic Methods) ,也叫特殊方法(Special Methods) 或 dunder 方法(Double Underscore Methods) ,是指那些以双下划线开头和结尾的方法,例如 __init__、__str__、__call__、__len__ 等。
它们的“魔术”之处在于:你通常不会直接调用它们,而是由 Python 解释器在特定场景下自动调用,从而让你的对象能够支持内置操作(如打印、加法、迭代、调用等)
注意事项
- 不要手动调用魔术方法(除非必要)
- 应该写
len(obj)而不是obj.__len__(),因为前者有安全检查和回退机制。
- 应该写
- 不是所有
__xxx__都是魔术方法- 比如
__private是名称改写(name mangling),不属于魔术方法。
- 比如
- 魔术方法是 Python “鸭子类型” 和协议(Protocol)的基础
- 只要你的类实现了
__iter__,它就可以被for循环使用,无需继承特定类。
- 只要你的类实现了
常见的魔术方法
| 你写的代码 | 实际调用的魔术方法 | 作用说明 |
|---|---|---|
obj = MyClass() | __new__, __init__ | 创建并初始化对象 |
print(obj) | __str__ | 返回人类可读的字符串表示 |
repr(obj) | __repr__ | 返回开发者友好的字符串表示 |
len(obj) | __len__ | 支持 len() 函数 |
obj + other | __add__ | 重载 + 运算符 |
obj[key] | __getitem__ | 支持索引访问(如字典、列表) |
for x in obj | __iter__ | 支持迭代 |
with obj: ... | __enter__, __exit__ | 支持上下文管理器(with语句) |
obj() | __call__ | 让对象可被调用 |
什么魔方方法会被默认调用
| 操作 / 语法 | 自动调用的魔法方法 |
|---|---|
a + b | a.__add__(b) |
len(obj) | obj.__len__() |
str(obj) | obj.__str__() |
repr(obj) | obj.__repr__() |
obj[key] | obj.__getitem__(key) |
obj() | obj.__call__() |
for x in obj | obj.__iter__() |
with obj: ... | obj.__enter__(), obj.__exit__() |
bool(obj) 或 if obj: | obj.__bool__()(或回退到 __len__()) |
obj.attr | obj.__getattribute__('attr') |
举个__call__的例子
class Test:
def __init__(self,print_args):
self.print_args =print_args
def __call__(self,print_args = True):
print(self.print_args)
test1 =Test(True)
# 此时,调用的是 __str__ 函数
print(test1)
# 调用的是 __call__ 函数
test1()