当前位置: 首页 > news >正文

python3中类的__getitem__和__len__使用场景

目录

  • 一、`__getitem__` 的使用场景
    • 场景1:让对象支持 `[]` 访问
    • 场景2:支持切片操作
    • 场景3:实现类似 dict 的访问
  • 二、`__len__` 的使用场景
    • 示例
  • 三、`__getitem__` + `__len__` 常见组合场景
    • 场景1:让对象可以被 `for` 遍历
    • 场景2:深度学习 Dataset(非常经典)
  • 四、典型应用领域
  • 五、一个高级实际例子(懒加载数据集)
  • 六、底层调用机制
  • 七、什么时候必须实现?

Python3中,__getitem____len__是两个非常常见的魔术方法(magic methods),主要用于让自定义类表现得像容器(list / dict / tuple 等)
当实现它们后,你的对象就可以被[]访问、被len()调用。

我给你从使用场景 + 示例 + 原理三个层面讲清楚。


一、__getitem__的使用场景

__getitem__(self, key)用于支持索引访问

obj[key]

Python 会自动调用

obj.__getitem__(key)

场景1:让对象支持[]访问

例如实现一个类似list的容器。

classMyList:def__init__(self,data):self.data=datadef__getitem__(self,index):returnself.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对象。

classMyList:def__init__(self,data):self.data=datadef__getitem__(self,key):print(type(key))returnself.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 的访问

例如:

classConfig:def__init__(self):self.data={"lr":0.001,"batch":32}def__getitem__(self,key):returnself.data[key]cfg=Config()print(cfg["lr"])

输出

0.001

二、__len__的使用场景

__len__(self)用于支持

len(obj)

Python 会自动调用:

obj.__len__()

示例

classMyList:def__init__(self,data):self.data=datadef__len__(self):returnlen(self.data)a=MyList([1,2,3,4])print(len(a))

输出

4

三、__getitem__+__len__常见组合场景

这两个方法经常一起使用,因为 Python 的很多机制依赖它们。


场景1:让对象可以被for遍历

classMyList:def__init__(self,data):self.data=datadef__getitem__(self,index):returnself.data[index]def__len__(self):returnlen(self.data)a=MyList([10,20,30])forxina: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

classMyDataset:def__init__(self,data):self.data=datadef__len__(self):returnlen(self.data)def__getitem__(self,idx):returnself.data[idx]

然后:

dataset=MyDataset(data)len(dataset)dataset[10]forxindataset:...

PyTorch DataLoader依赖的就是这两个函数。

典型框架:

  • PyTorch Dataset
  • HuggingFace Dataset
  • TensorFlow Dataset

四、典型应用领域

场景用途
数据集类dataset[i]
自定义容器模拟 list
配置对象config["lr"]
数据缓存cache[key]
大规模数据访问懒加载

五、一个高级实际例子(懒加载数据集)

classImageDataset:def__init__(self,files):self.files=filesdef__len__(self):returnlen(self.files)def__getitem__(self,idx):file=self.files[idx]image=load_image(file)returnimage

好处:

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)

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

http://www.jsqmd.com/news/462636/

相关文章:

  • FFmpeg QSV硬解性能对比测试:Intel核显在不同分辨率H264视频下的CPU占用率
  • 2026年留学中介机构排名及选择指南 - 品牌排行榜
  • 【C++27生产级并行指南】:实测12款主流编译器对par_unseq支持度,GCC 14.3已率先达标
  • 2022-2025年图像超分辨率技术演进与多领域应用全景解析
  • Qwen2.5为何无法生成JSON?结构化输出部署避坑指南
  • Magma开发入门:Python基础API使用指南
  • Apache POI 4.1.2 实战指南:从Maven依赖到Excel/Word文件读写
  • 用数据说话 9个降AIGC平台测评:本科生降AI率必看攻略
  • Cursor AI 编程助手:从自然语言到可执行代码的魔法解析
  • 【ComfyUI】Qwen-Image-Edit-F2P故障诊断指南:常见错误如“403 Forbidden”的排查与解决
  • 第15章-4 装配体静力学分析实战:模型简化与网格划分优化策略
  • Qt桌面应用开发:集成SmallThinker-3B-Preview打造跨平台智能办公助手
  • 游戏辅助工具LeagueAkari:智能决策系统与三维数据模型解析
  • 浙江政务微应用实战:基于UniApp的SSO登录、埋点与适老化一体化开发指南
  • 鼎捷T100开发实战:Genero BDL INPUT语句高级事件处理与优化技巧
  • 塑料水箱哪个更值得信赖
  • 【稀缺首发】NASA JPL内部量子模拟器C++架构解密(含QubitRegister类设计白皮书PDF)
  • 2026国内最新青少年洗发水品牌top5推荐! - 十大品牌榜
  • 2026南京别墅定制深度选型指南:不同需求下的最佳匹配方案 - 速递信息
  • Nunchaku-flux-1-dev企业级部署指南:高可用与负载均衡架构
  • C++新特性-简化构造相关
  • ROS2 Galactic版turtlesim小乌龟仿真全攻略:从安装到键盘控制实战
  • 数据库一体机简史:从Britton-Lee的陨落到Exadata和zData的智能复兴
  • Altium Designer2025安装避坑指南:从系统配置到许可证激活的全流程解析
  • C++新特性-列表初始化
  • 打开网站显示403 Forbidden(禁止访问)错误怎么办|已解决
  • HIC数据预处理实战:Hicup、ALLHiC和juicer三大工具保姆级教程(含避坑指南)
  • 智能家居玩家必备:用HACS解锁HomeAssistant隐藏玩法(支持HomeKit/米家双平台)
  • 兰州装修公司怎么选?这份“口碑爆棚”的装修公司名单请查收 - 装修热点在线
  • 立创EDA专业版实战:标准RGB接口40pin转50pin转接板设计与验证