Подтвердить что ты не робот

Как создать собственный класс списка в python?

Я хотел бы написать собственный класс списка в Python (позвоните ему MyCollection), где я могу в конечном итоге позвонить:

for x in myCollectionInstance:
    #do something here

Как бы я это сделал? Есть ли какой-то класс, который я должен расширить, или есть какие-то функции, которые я должен переопределить, чтобы сделать это?

4b9b3361

Ответ 2

Ваш подкласс 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

Это позволяет выполнять итерацию по любому экземпляру MyCollection.

Ответ 3

Мне нравится подкласс MutableSequence, как рекомендованный Алексом Мартелли, Это хорошо работает для меня, особенно когда мне нужно добавить собственные методы поверх списка, который я создаю.

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

Вы можете расширить класс 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