常见误解是以为能重载内置函数本身,实际是通过实现__len__、__str__等特殊方法来定制对象对len()、str()等调用的响应行为。
Python 中不能“重载”内置函数,但可以通过定义特殊方法(也叫魔术方法)来改变类实例在使用内置函数时的行为。这常被误称为“重载”,实际是**定制对象与内置函数的交互方式**。
很多人想写 len(obj) 时让它返回自定义值,或让 str(obj) 输出特定格式——这不是重载 len 或 str 函数本身(它们的代码不可改),而是让自己的类响应这些函数调用。
Python 通过查找对象内部的特殊方法(如 __len__、__str__)来实现这种响应。
以下是一些高频对应关系,只需在类中实现对应方法即可:
len(obj) → 实现 __len__(self),必须返回非负整数str(obj) → 实现 __str__(self),面向用户友好的字符串表示repr(obj) → 实现 __repr__(self),面向开发者,尽量可复现对象bool(obj) → 实现 __bool__(self)(Python 3)或 __nonzero__(Python 2),返回 True 或 False
int(obj), float(obj) → 分别实现 __int__(self)、__float__(self)
abs(obj) → 实现 __abs__(self)
obj[key](索引)→ 实现 __getitem__(self, key)
假设你写了一个包装 list 的类:
class MyList:
def __init__(self, data):
self.data = data
def __len__(self):
return len(self.data) # 返回内部列表长度
def __str__(self):
return f"MyList({self.data})"
def __getitem__(self, i):
return self.data[i]使用效果:
x = MyList([1, 2, 3]) print(len(x)) # 输出:3(调用了 __len__) print(str(x)) # 输出:MyList([1, 2, 3])(调用了 __str__) print(x[0]) # 输出:1(调用了 __getitem__)
__len__ 必须返回 int,且不能为负数,否则报 ValueError
__bool__ 缺失时,Python 默认 fallbac
k 到 __len__:若 len(obj) == 0 则视为 False
len = lambda x: 42),这只会污染当前作用域,不改变类型行为