我不知道下一个代码中的" self._iterator = iter(self._container)"。
在django.http:
class HttpResponse(object):
def __iter__(self):
self._iterator = iter(self._container)
return self
def next(self):
chunk = self._iterator.next()
if isinstance(chunk, unicode):
chunk = chunk.encode(self._charset)
return str(chunk)
我读了api:
Return an iterator object. The first
argument is interpreted very
differently depending on the presence
of the second argument. Without a
second argument, o must be a
collection object which supports the
iteration protocol (the __iter__()
method), or it must support the
sequence protocol (the __getitem__()
method with integer arguments starting
at 0). If it does not support either
of those protocols, TypeError is
raised. If the second argument,
sentinel, is given, then o must be a
callable object. The iterator created
in this case will call o with no
arguments for each call to its next()
method; if the value returned is equal
to sentinel, StopIteration will be
raised, otherwise the value will be
returned. One useful application of
the second form of iter() is to read
lines of a file until a certain line
is reached. The following example
reads a file until"STOP" is reached:
但我也不知道iter函数的作用。
i know the __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
请尝试使用代码而不是文本,因为我的英语不是很好,谢谢
可以迭代一个迭代器:
for item in mylist:
print item
for key,item in enumerate(mylist):
print key,":",item
for i in range(0,50):
print i
要使用for item in X,X必须是可迭代的。
您可以通过添加next(self)等使您的类可迭代,如示例中所示。所以用
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
HttpResponse是可以存储字符串数据的类。数据存储在名为_container的成员变量中。
假设hr是HttpResponse的实例,其中包含数据。调用iter(hr)时,应该返回一个迭代器。该迭代器将从_container成员变量返回数据。
此类"包装" _container成员,以便它始终可以返回非Unicode文本。因为此类具有__iter__()方法函数,所以当您调用iter()时,实际上是在调用特殊的__iter__()方法函数。此方法函数实际上确实在_container成员变量上调用iter()以获得其内容的迭代器。但是,然后将此迭代器保存在_iterator成员变量中,并返回self。现在可以进行迭代了。
定义了next()方法函数。如果_container变量的类型为Unicode,它将调用encode()以某种编码方式对Unicode进行编码,并返回非Unicode。它使用另一个成员变量_charset来知道要使用哪个字符集进行编码。如果container变量的类型不是Unicode,则它必须是普通的字符串类型,并且只需简单地返回数据即可。
这样,可以迭代此类中的"包装"对象,并始终返回非Unicode文本。
我对迭代器协议的这种实现感到惊讶。当它返回一个迭代器给您时,它只是返回self,因此,如果您两次调用iter(),实际上并不会获得两个可用的迭代器。这似乎很危险。我猜Django代码从没有做过这样的事情。