魔术方法
理解 __str__/__repr__/__eq__/__hash__/__call__ 等
魔术方法
魔术方法(dunder methods)是带双下划线的方法,让你自定义类的行为。
常用魔术方法
python
class Vector:
def __init__(self, x, y):
self.x, self.y = x, y
def __str__(self): # print() / str()
return f"Vector({self.x},{self.y})"
def __repr__(self): # 调试输出
return f"Vector({self.x},{self.y})"
def __len__(self): # len()
return 2
def __add__(self, other): # +
return Vector(self.x+other.x, self.y+other.y)
def __eq__(self, other): # ==
return self.x==other.x and self.y==other.y
def __mul__(self, scalar): # *
return Vector(self.x*scalar, self.y*scalar)
def __getitem__(self, i): # [索引]
return self.x if i==0 else self.y
v1, v2 = Vector(1,2), Vector(3,4)
print(v1) # Vector(1,2)
print(v1 + v2) # Vector(4,6)
print(v1 == Vector(1,2)) # True
print(v1 * 3) # Vector(3,6)
print(v1[0], v1[1]) # 1 2
魔术方法速查表
| 方法 | 触发 | 用途 |
|---|---|---|
| `__init__` | `obj = Class()` | 构造 |
| `__str__` | `print(obj)` | 字符串 |
| `__len__` | `len(obj)` | 长度 |
| `__add__` | `obj1 + obj2` | 加法 |
| `__eq__` | `obj1 == obj2` | 相等判断 |
| `__getitem__` | `obj[i]` | 索引访问 |
| `__enter__/__exit__` | `with obj:` | 上下文管理 |
小结
魔术方法让你的类像内置类型一样工作,是 Python 强大表达能力的重要来源。