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.
Czy ma nazywać się kod klienta? Zakładam, że nie, ponieważ ma on __fname__ formularz – danben
- --name - formularz gdzie te kreski są podkreślenia – danben
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