我嘗試實作在直接訪問(按索引)或通過 FOR IN 回圈陳述句時回傳包裝元素的串列。目前我有以下代碼:
class ItemWrappedList(list):
def __getitem__(self, y):
result = super().__getitem__(y)
return f'<item>{result}</item>'
lst = ItemWrappedList(['1', '2', '3'])
for pos in range(len(lst)):
print(lst[pos])
#>>> <item>1</item>
#>>> <item>2</item>
#>>> <item>3</item>
for value in lst:
print(value)
#>>> 1
#>>> 2
#>>> 3
如您所見,第一個回圈按預期正常作業。但是第二個回圈呼叫了我無法覆寫的串列方法。是否有可能強制 ItemWrappedList 類在所有情況下都具有相同的行為?
PS我嘗試了不同的方式來實作/覆寫__next__和__iter__方法,但似乎__next__從來沒有被呼叫過。
uj5u.com熱心網友回復:
覆寫該__iter__方法應該可以解決問題:
class ItemWrappedList(list):
def __getitem__(self, y):
result = super().__getitem__(y)
return f'<item>{result}</item>'
def __iter__(self):
return (f'<item>{x}</item>' for x in list.__iter__(self))
lst = ItemWrappedList(['1', '2', '3'])
for pos in range(len(lst)):
print(lst[pos])
for value in lst:
print(value)
<item>1</item>
<item>2</item>
<item>3</item>
<item>1</item>
<item>2</item>
<item>3</item>
uj5u.com熱心網友回復:
那是因為當你說for i in lstPython 首先呼叫iter(). lst如果lst的類已經實作__iter__了方法,那么首先要考慮的就是它。否則,它會繼續查看它是否已實施__getitem__。(否則會引發TypeError: object is not iterable)
由于您繼承自list并且list已經定義了該類__iter__,因此iter()總是發現它的__iter__第一個不是您的__getitem__.
因此,只需__iter__為您的班級實施:
class ItemWrappedList(list):
def __getitem__(self, y):
result = super().__getitem__(y)
return f"<item>{result}</item>"
def __iter__(self):
return (f"<item>{item}</item>" for item in super().__iter__())
lst = ItemWrappedList(["1", "2", "3"])
for pos in range(len(lst)):
print(lst[pos])
for value in lst:
print(value)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/530231.html
標籤:Python列表压倒一切
上一篇:如何將二維串列轉置為列視圖?
