簡體   English   中英

__getitem__在python中重載

[英]__getitem__ overloading in python

我試圖理解python中的運算符重載,我編寫了一個小程序,它重載__getitem__()方法並調用for循環:

class Ovl:
    data = [1,2,3,4,5]
    def __getitem__(self, index):
        return "Hiii"

x=Ovl()

for item in x:
    print item

該程序進入無限循環打印“Hiii”。 我想知道背后的原因。

根據object.__getitem__注意,

注意: for循環期望為非法索引引發IndexError ,以允許正確檢測序列的結尾

>>> class Ovl:
...     data = [1,2,3,4,5]
...     def __getitem__(self, index):
...         if index >= 5:
...             raise IndexError('End')
...         return "Hiii"
...
>>> x=Ovl()
>>>
>>> for item in x:
...     print item
...
Hiii
Hiii
Hiii
Hiii
Hiii

__getitem__的重載實際上允許你做這樣的事情:

>>> x = Ovl()
>>> x[6]
'Hi'
>>> x[8]
'Hi'

如果你想用for實現迭代你的類,你需要重載__iter__方法(參見這里: 如何為容器對象(Python)實現__iter __(self) )。

循環運行無限的原因是__iter__的默認實現顯然在內部調用了__getitem__ 實際上,你的for循環調用__getitem__(0)__getitem__(1)__getitem__(2)...順序,所以它似乎運行無限。

如果要修改__getitem__方法:

def __getitem__(self, index):
    return index, "Hi"

你可以看到到底發生了什么:

>>> x = Ovl()
>>> for item in x:
    print item 

(0, 'Hi')
(1, 'Hi')
(2, 'Hi')
(3, 'Hi')
(4, 'Hi')
(5, 'Hi')
(6, 'Hi')
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM