文章目录
- 前言
- 一、什么是 `__getitem__` 和 `__len__`?
- 二、`__getitem__`:索引访问的魔法
- 2.1 基本用法
- 2.2 灵活应用
- 三、`__len__`:长度查询的钥匙
- 3.1 基本用法
- 3.2 在 Vocab 中的应用
- 四、 结合使用:打造完整序列
- 五、为什么需要 `__getitem__` 和 `__len__`?
- 六、 实际应用场景
- 总结
前言
Python 的魅力之一在于它的灵活性:内置类型如列表、字典和元组让我们轻松处理数据,而当这些类型不够用时,我们还能打造自己的“定制容器”。在“Python 解码”系列的第三篇中,我们将聚焦两个魔法方法——__getitem__
和 __len__
,它们是自定义序列类型的核心钥匙。
想让你的类支持索引访问(如 obj[0]
)?想让 len()
函数返回对象的长度? __getitem__
和 __len__
正是实现这些功能的秘密武器。通过本文,你将学会如何用它们解锁 Python 数据模型的潜能,打造属于自己的序列类型。让我们一起开启这场探索吧!
一、什么是 __getitem__
和 __len__
?
在 Python 中,__getitem__
和 __len__
是特殊方法(也叫“魔法方法”或“dunder 方法”),属于 Python 数据模型的一部分。它们让自定义对象能够模仿内置序列类型(如列表或元组)的行为:
__getitem__
:定义对象在被索引或键访问(obj[key]
)时的行为。__len__
:定义对象在调用len()
函数时的行为,返回长度。
这两个方法简单却强大,结合起来可以让你的类表现得像一个完整的序列,支持索引、长度查询,甚至迭代。接下来,我们逐一解码它们的用法。
二、__getitem__
:索引访问的魔法
__getitem__
是自定义对象支持 []
操作的关键。当你写下 obj[key]
时,Python 会自动调用 obj.__getitem__(key)
。这里的 key
可以是整数(索引)、切片(slice),甚至是其他类型(例如字典的键)。
2.1 基本用法
让我们创建一个简单的类 MyList
,模拟列表的索引行为:
class MyList:def __init__(self, data):self.data = datadef __getitem__(self, index):return self.data[index]# 使用示例
ml = MyList([1, 2, 3, 4])
print(ml[0]) # 输出: 1
print(ml[1:3])