[英]__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.