2011-07-03 65 views
21

我想用Python語言編寫自定義列表類(姑且稱之爲MyCollection),在那裏我可以最終調用:如何在python中創建自定義列表類?

for x in myCollectionInstance: 
    #do something here 

我怎麼會去這樣做呢?是否有一些課程需要延續,或者是否有我必須覆蓋的功能?

+0

您能否更好地闡明您的要求?如果你繼承任何迭代類(列表,字典等),它應該沒有問題。但也許我錯過了什麼? – mac

+0

@mac:如果我創建了一個可迭代的類,我還想要一種方法來訪問底層列表對象,以便我可以提供額外的函數來處理它。我不想要一個鍵值對(dict),所以模擬索引集合(列表)就足夠了。 –

回答

25

你可以繼承list如果您的收藏基本上就像一個列表:

class MyCollection(list): 
    def __init__(self, *args, **kwargs): 
     super(MyCollection, self).__init__(args[0]) 

但是,如果你的主要的心願就是您的收藏支持迭代器協議,你只需要提供__iter__方法:

class MyCollection(object): 
    def __init__(self): 
     self._data = [4, 8, 15, 16, 23, 42] 

    def __iter__(self): 
     for elem in self._data: 
      yield elem 

這可以讓你的任何實例遍歷。

+1

我認爲你的超級方法的簽名是錯誤的(只有99%可以肯定,但不是'list()'只接受一個可迭代的參數嗎?還有,對於超級調用? – mac

+1

是的,你當然是對的,我編輯了代碼。謝謝你的提示。 – jena

3

你可以擴展list類:

class MyList(list): 

    def __init__(self, *args): 
     super(MyList, self).__init__(args[0]) 
     # Do something with the other args (and potentially kwars) 

用法示例:

a = MyList((1,2,3), 35, 22) 
print(a) 
for x in a: 
    print(x) 

預期輸出:

[1, 2, 3] 
1 
2 
3 
10

我想繼承MutableSequence,作爲recommended by Alex Martelli。這適用於我,特別是當我需要在我創建的列表頂部添加自定義方法時。

from collections import MutableSequence 

class MyList(MutableSequence): 
    """A container for manipulating lists of hosts""" 
    def __init__(self, data=None): 
     """Initialize the class""" 
     super(MyList, self).__init__() 
     if (data is not None): 
      self._list = list(data) 
     else: 
      self._list = list() 

    def __repr__(self): 
     return "<{0} {1}>".format(self.__class__.__name__, self._list) 

    def __len__(self): 
     """List length""" 
     return len(self._list) 

    def __getitem__(self, ii): 
     """Get a list item""" 
     return self._list[ii] 

    def __delitem__(self, ii): 
     """Delete an item""" 
     del self._list[ii] 

    def __setitem__(self, ii, val): 
     # optional: self._acl_check(val) 
     self._list[ii] = val 

    def __str__(self): 
     return str(self._list) 

    def insert(self, ii, val): 
     # optional: self._acl_check(val) 
     self._list.insert(ii, val) 

    def append(self, val): 
     self.insert(len(self._list), val) 

if __name__=='__main__': 
    foo = MyList([1,2,3,4,5]) 
    foo.append(6) 
    print foo # <MyList [1, 2, 3, 4, 5, 6]> 
+4

'if not(data is None):'這不是你如何編寫你的python代碼,除非你是一個Grand Jedi Master。數據不是無「 - 這看起來不錯。 – byashimov

相關問題