Как реализовать Минимальный класс, который ведет себя как последовательность в Python?
Я ищу пример минимального примера класса, который имитирует неизменяемую последовательность в Python.
class MySequence()
...
a = MySequence()
len(a)
for i in a:
pass
a[0]
Какие методы должны быть реализованы?
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__
, если бы хотел быть более ясным или хотел нестандартного поведения итерации.)