我觉得题主你想问的应该是为什么__getitem()__具有这种特殊的作用,那题主应该要知道这种前后带双下斜杠"__"的方法是类的专有方法,与一般的方法不同,我这里引用python官方文档的解释:

3.3. 特殊方法名称

一个类可以通过定义具有特殊名称的方法来实现由特殊语法所引发的特定操作 (例如算术运算或下标与切片)。这是 Python 实现 操作符重载 的方式,允许每个类自行定义基于操作符的特定行为。例如,如果一个类定义了名为 __getitem__() 的方法,并且 x 为该类的一个实例,则 x[i] 基本就等同于 x.__getitem__(x, i)

除此之外还有__len_()专有方法,则len(x)就等同于x.__len__(x);

__add__()专有方法,则x+other就等同于x.__add__(x,other)

还有很多其他专有方法:详情请参考:

https://docs.python.org/zh-cn/3.7/reference/datamodel.html#special-method-names


在DataLoder的iter中,会触发子类Dataset中的getiterm函数读取数据,并拼接成一个batch返回,作为模型真正的输入


遇到了不错的解释,不可能这个对象继承了object父类里面的__getitem__,可能是在编译阶段类似于alias的过程:

于是乎:


操作符重载:

如果一个类定义了名为__getitem__()的方法,x为该类的一个实例:

x[i]可是为x.__getitem__(x,i)


这是 python 自身的 data model,跟 pytorch 没有关系。简单的说,这些 magic methods 你只要实现之后,你就可以使用 python 的这些 syntax sugar。比如实现 __add__ 你就可以使用加法符号运算你的类,实现 __len__ 就可以用 len 函数取得你内部的数据长度等等。这些都是 Python interpretor 帮你做的。


我记得这个不是python类的魔法方法嘛,可以通过下标去返回值,这个跟pytorch没关系吧应该


推荐阅读:
相关文章