常见误解是以为能重载内置函数本身,实际是通过实现__len__、__str__等特殊方法来定制对象对len()、str()等调用的响应行为。

Python 中不能“重载”内置函数,但可以通过定义特殊方法(也叫魔术方法)来改变类实例在使用内置函数时的行为。这常被误称为“重载”,实际是**定制对象与内置函数的交互方式**。
什么是“重载内置函数”的常见误解?
很多人想写 len(obj) 时让它返回自定义值,或让 str(obj) 输出特定格式——这不是重载 len 或 str 函数本身(它们的代码不可改),而是让自己的类响应这些函数调用。
Python 通过查找对象内部的特殊方法(如 __len__、__str__)来实现这种响应。
常用内置函数对应的关键特殊方法
以下是一些高频对应关系,只需在类中实现对应方法即可:
千博企业网站管理系统个人版免费下载、免费使用、功能无限制,完全免费拥有(请尊重开发者版权,保留首页底部版权显示):内含Flash动画源码、Access数据库程序包、SQL数据库程序包。千博企业网站管理系统个人版2012.3.19更新1.修正后台生成静态页面函数;2.增加集成环境以方便用户本地调试、体验。千博企业网站管理系统个人版:免费下载、免费使用、功能无限制。完全免费拥有(请尊重开发者版权,保留
立即学习“Python免费学习笔记(深入)”;
-
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)
一个简单例子:让自定义列表类支持 len() 和 str()
假设你写了一个包装 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 默认 fallback 到__len__:若len(obj) == 0则视为False - 不要试图修改内置函数本身(如重定义
len = lambda x: 42),这只会污染当前作用域,不改变类型行为 - 特殊方法必须是实例方法,且名字拼写严格(双下划线开头结尾),少一个下划线就无效










