Если вы просто хотите иметь возможность перебирать вашу последовательность, вам просто нужно реализовать метод __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__
, если бы я хотел быть более понятным или хотел нестандартного поведения итерации.)