python3中类的__getitem__和__len__使用场景
·
目录
在 Python3 中,__getitem__ 和 __len__ 是两个非常常见的 魔术方法(magic methods),主要用于让自定义类 表现得像容器(list / dict / tuple 等)。
当实现它们后,你的对象就可以被 [] 访问、被 len() 调用。
我给你从 使用场景 + 示例 + 原理 三个层面讲清楚。
一、__getitem__ 的使用场景
__getitem__(self, key) 用于 支持索引访问:
obj[key]
Python 会自动调用
obj.__getitem__(key)
场景1:让对象支持 [] 访问
例如实现一个类似 list 的容器。
class MyList:
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return self.data[index]
a = MyList([10,20,30])
print(a[1])
输出
20
执行流程:
a[1]
↓
a.__getitem__(1)
↓
self.data[1]
场景2:支持切片操作
Python 的切片:
a[1:3]
其实传入的是 slice 对象。
class MyList:
def __init__(self,data):
self.data = data
def __getitem__(self,key):
print(type(key))
return self.data[key]
a = MyList([1,2,3,4])
print(a[1:3])
输出
<class 'slice'>
[2,3]
所以 __getitem__ 可以同时支持:
obj[i]
obj[i:j]
obj[i:j:k]
场景3:实现类似 dict 的访问
例如:
class Config:
def __init__(self):
self.data = {
"lr":0.001,
"batch":32
}
def __getitem__(self,key):
return self.data[key]
cfg = Config()
print(cfg["lr"])
输出
0.001
二、__len__ 的使用场景
__len__(self) 用于支持
len(obj)
Python 会自动调用:
obj.__len__()
示例
class MyList:
def __init__(self,data):
self.data = data
def __len__(self):
return len(self.data)
a = MyList([1,2,3,4])
print(len(a))
输出
4
三、__getitem__ + __len__ 常见组合场景
这两个方法 经常一起使用,因为 Python 的很多机制依赖它们。
场景1:让对象可以被 for 遍历
class MyList:
def __init__(self,data):
self.data = data
def __getitem__(self,index):
return self.data[index]
def __len__(self):
return len(self.data)
a = MyList([10,20,30])
for x in a:
print(x)
执行逻辑:
for x in a
↓
index = 0
a.__getitem__(0)
index = 1
a.__getitem__(1)
index = 2
a.__getitem__(2)
直到 IndexError 结束。
场景2:深度学习 Dataset(非常经典)
例如 PyTorch Dataset:
class MyDataset:
def __init__(self, data):
self.data = data
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx]
然后:
dataset = MyDataset(data)
len(dataset)
dataset[10]
for x in dataset:
...
PyTorch DataLoader 依赖的就是这两个函数。
典型框架:
- PyTorch Dataset
- HuggingFace Dataset
- TensorFlow Dataset
四、典型应用领域
| 场景 | 用途 |
|---|---|
| 数据集类 | dataset[i] |
| 自定义容器 | 模拟 list |
| 配置对象 | config["lr"] |
| 数据缓存 | cache[key] |
| 大规模数据访问 | 懒加载 |
五、一个高级实际例子(懒加载数据集)
class ImageDataset:
def __init__(self, files):
self.files = files
def __len__(self):
return len(self.files)
def __getitem__(self, idx):
file = self.files[idx]
image = load_image(file)
return image
好处:
dataset[100]
才会加载第100张图片
而不是一次加载全部数据。
这是 深度学习数据集的核心设计。
六、底层调用机制
| Python代码 | 实际调用 |
|---|---|
len(obj) |
obj.__len__() |
obj[i] |
obj.__getitem__(i) |
for x in obj |
__getitem__ 或 __iter__ |
七、什么时候必须实现?
必须实现 __len__ 和 __getitem__ 的典型场景:
1️⃣ PyTorch Dataset
__len__()
__getitem__()
2️⃣ 自定义数据容器
3️⃣ 模拟 list/dict 行为
✅ 一句话总结
| 方法 | 作用 |
|---|---|
__getitem__ |
支持 obj[key] |
__len__ |
支持 len(obj) |
通常用于 让类表现得像一个容器。
更多推荐


所有评论(0)