我想用Python語言編寫自定義列表類(姑且稱之爲MyCollection
),在那裏我可以最終調用:如何在python中創建自定義列表類?
for x in myCollectionInstance:
#do something here
我怎麼會去這樣做呢?是否有一些課程需要延續,或者是否有我必須覆蓋的功能?
我想用Python語言編寫自定義列表類(姑且稱之爲MyCollection
),在那裏我可以最終調用:如何在python中創建自定義列表類?
for x in myCollectionInstance:
#do something here
我怎麼會去這樣做呢?是否有一些課程需要延續,或者是否有我必須覆蓋的功能?
@Kshitij:具體來說,你需要定義'__iter__'。 – katrielalex
不一定。 'for'也會從索引0迭代到'__getitem __()'引發異常;詳細信息請參閱鏈接的文檔。 –
你可以繼承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
這可以讓你的任何實例遍歷。
你可以擴展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
我想繼承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]>
'if not(data is None):'這不是你如何編寫你的python代碼,除非你是一個Grand Jedi Master。數據不是無「 - 這看起來不錯。 – byashimov
您能否更好地闡明您的要求?如果你繼承任何迭代類(列表,字典等),它應該沒有問題。但也許我錯過了什麼? – mac
@mac:如果我創建了一個可迭代的類,我還想要一種方法來訪問底層列表對象,以便我可以提供額外的函數來處理它。我不想要一個鍵值對(dict),所以模擬索引集合(列表)就足夠了。 –