Как реализовать Минимальный класс, который ведет себя как последовательность в Python?


Я ищу пример минимального примера класса, который имитирует неизменяемую последовательность в Python.

class MySequence()
    ...

a = MySequence()

len(a)

for i in a:
    pass

a[0]

Какие методы должны быть реализованы?

1 7

1 ответ:

Если вы просто хотите иметь возможность перебирать свою последовательность, вам просто нужно реализовать метод __iter__, возвращающий итерацию. Самый простой способ сделать это-создать генератор, используя оператор yield.

class MySequence(object):
    def __iter__(self):
        yield 1
        yield 2
        yield 3

for x in MySequence():
    print x # prints 1, then 2, then 3
Однако это не позволит сделать такие вещи, как MySequence()[1]. Для этого вам нужно реализовать метод __getitem__, а также, вероятно, реализовать __len__.
class MySequence(object):
    def __len__(self):
        return 3

    def __getitem__(self, key):
        if key == 0:
            return 1
        elif key == 1:
            return 2
        elif key == 2:
            return 3
        else:
            raise IndexError()

s = new MySequence()

for i in range(len(s)):
    print s[i] # prints 1, then 2, then 3

for x in s:
    print x # prints 1, then 2, then 3
Обратите внимание, что я опустил __iter__. До тех пор, пока __getitem__ поднимает IndexError , Когда вы пытаетесь получить значение, которое вне пределов, Python может использовать его для итерации. (Я все еще мог бы включить __iter__, если бы хотел быть более ясным или хотел нестандартного поведения итерации.)