我覺得題主你想問的應該是為什麼__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沒關係吧應該


推薦閱讀:
相关文章