2014-12-03 50 views
0

我處於一個有點棘手的情況與列表子類。在Python中,當附加兩個列表時,在第二個列表上調用什麼來獲取項目?

我使用List類是爲了返回的東西從什麼實際內部存儲(略有不同覆蓋__iter____getitem__這是因爲這是需要被希望只在完成後該項目是第一個直接訪問處理時間)

我的問題出現在以下用例中。比方說,對於這個例子的使用,重寫的方法將內部值轉換爲字符串。

>>> myList = MyList([1, 2, 3]) 
>>> standardList = list(["a", "b", "c"]) 
>>> 
>>> for item in myList: 
>>>  print item 
"1" 
"2" 
"3" 
>>> newList = standardList + myList 
>>> for item in newList: 
>>>  print item 
"a" 
"b" 
"c" 
1 
2 
3 

那麼這裏後,我是值是如何從myList拉時運行standardList + myList,這樣我就可以確保newList已取得了相關的修改。

順便說一句,我很清楚地知道,如果我推翻MyList.__add__,然後做myList + standardList我能得到這個工作,但是這是在其他地方使用的模塊,我寧願確保它能正常工作的正確方式兩個方向。

感謝

回答

0

你可以簡單地通過列表添加的結果作爲MYLIST的構造函數,如:

newList = MyList(standardList + myList) 
+0

除了我很好的結果列表是一個列表,myList中的元素只需要先修改。 – Hugh 2014-12-03 13:09:52

2

爲了確保如果在兩個方向上的作品,你應該同時定義會覆蓋__add____radd__在你的MyList班。從data model page引用(第7彈點)*:

異常前述條款:如果左操作數是 實例的內置式或新式類,右邊操作數是一個 該類型或類的適當子類的實例並且覆蓋基地的__rop__()方法,在左操作數的__op__()方法之前嘗試右操作數的__rop__()方法 。

所以,你的代碼如下:

class MyList(list): 

    def __radd__(self, other): 
     return MyList(list.__add__(other, self)) 

*請注意,在Python 2個文檔中提到的適當的子類東西其實是一個documentation bugthey fixed it in Python 3

如果右操作數的類型是左操作數類型的子類 和那個子類提供了反映方法的操作,這個方法將在左操作數的非反射 方法之前調用。這種行爲允許子類覆蓋他們的祖先的 操作。

+0

我做了一些研究 - 只有當左操作數不支持'__add__'時,__radd__'才起作用,在這種情況下,'__add__'確實有效。不過,我可以讓MyList不是列表的子類,而只是重新實現列表函數...... – Hugh 2014-12-03 13:08:16

相關問題