2009-12-25 13 views
15

Mam następujący kod w django.template:W jaki sposób ta klasa implementuje metodę "__iter__" bez implementacji "next"?

class Template(object): 
    def __init__(self, template_string, origin=None, name='<Unknown Template>'): 
     try: 
      template_string = smart_unicode(template_string) 
     except UnicodeDecodeError: 
      raise TemplateEncodingError("Templates can only be constructed from unicode or UTF-8 strings.") 
     if settings.TEMPLATE_DEBUG and origin is None: 
      origin = StringOrigin(template_string) 
     self.nodelist = compile_string(template_string, origin) 
     self.name = name 

    def __iter__(self): 
     for node in self.nodelist: 
      for subnode in node: 
       yield subnode 

    def render(self, context): 
     "Display stage -- can be called many times" 
     return self.nodelist.render(context) 

Część jestem mylić temat znajduje się poniżej. Jak działa ta metoda __iter__? Nie mogę znaleźć żadnej odpowiadającej mu metody next.

def __iter__(self): 
     for node in self.nodelist: 
      for subnode in node: 
       yield subnode 

Jest to jedyny sposób, że wiem, jak wdrożyć __iter__:

class a(object): 
    def __init__(self,x=10): 
     self.x = x 
    def __iter__(self): 
     return self 
    def next(self): 
     if self.x > 0: 
      self.x-=1 
      return self.x 
     else: 
      raise StopIteration 
ainst = a() 
for item in aisnt: 
    print item 

W swoich odpowiedziach, spróbuj użyć przykładów kodu zamiast tekstu, bo mój angielski nie jest zbyt dobry. Dziękuję Ci.

Odpowiedz

32

Z docs:

Jeśli __iter__() metoda obiektu kontenera jest realizowany jako generator, automatycznie wróci obiekt iterator (technicznie, obiekt generator) zaopatrujących __iter__() i next() metody.

11

To __iter__ metoda zwraca pytona generator (patrz documentation), ponieważ używa słowa kluczowego yield. Generator automatycznie dostarczy metodę next(); powołując się na dokumentację:

Co sprawia, że ​​generatory tak kompaktowy, że jest __iter __(), a następnie() metody są tworzone automatycznie.

EDIT:

Generatory są naprawdę przydatne. Jeśli ich nie znasz, sugeruję, abyś je przeczytał i zagrał z jakimś kodem testowym.

Oto niektóre informacje na temat iteratorów i generatorów od StackOverflow.

+0

Czy ma nazywać się kod klienta? Zakładam, że nie, ponieważ ma on __fname__ formularz – danben

+0

- --name - formularz gdzie te kreski są podkreślenia – danben

+0

Nie mam pojęcia o Django, ale w końcu jest to po prostu składnia python. Gdy konieczne jest utworzenie iteratora dla obiektu Template, jego wywołanie '__iter __ (self)' zostanie wywołane. Następnie zwróci obiekt Generatora, który ma poprawną metodę next(). – catchmeifyoutry

Powiązane problemy