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)

通常用于 让类表现得像一个容器

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐