تكرار السؤال: …
الإجابة المختصرة
يجب أن يعرّف الكائن __iter__ تعيد iterator، والـ iterator يعرّف __next__ التي تعيد العنصر التالي وترمي StopIteration عند النهاية (ويعرّف __iter__ تعيد self).
الشرح
حلقة for تستدعي iter() مرة واحدة ثم next() متكررًا حتى StopIteration. أسهل طريقة لتنفيذ البروتوكول هي جعل __iter__ دالة generator. احرص على فصل الـ collection عن حالة التكرار: إذا خزنت موضع التكرار داخل الكائن نفسه، فلن تستطيع تكراره مرتين بشكل مستقل أو بشكل متداخل.
مثال بالكود
class Countdown:
def __init__(self, start: int):
self.start = start
def __iter__(self): # كل استدعاء يبدأ تكرارًا مستقلًا
n = self.start
while n > 0:
yield n
n -= 1
print(list(Countdown(3))) # [3, 2, 1]أخطاء شائعة
- تخزين حالة التكرار في الكائن نفسه فيصبح قابلًا للتكرار مرة واحدة فقط.
- إعادة None من __iter__ بدل iterator.