我不知道下一段代码中的“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:
返回一个迭代器对象。首先 论证被解释得非常 取决于存在的不同 第二个论点。没有 第二个论点,o必须是a 支持的集合对象 迭代协议(
__iter__()
方法),或者它必须支持 序列协议(__getitem__()
整数参数开始的方法 在0)。如果它也不支持 那些协议,TypeError
是 提高。如果是第二个参数, 哨兵,给予,然后o必须是 可调用的对象。迭代器已创建 在这种情况下,将调用o而不是 每次调用next()
的参数 方法;如果返回的值相等 哨兵,StopIteration将 提出,否则价值将是 回。一个有用的应用程序iter()
的第二种形式是阅读 直到某一行的文件行 到达了。以下示例 读取文件直到达到“STOP”:
但我也不知道它的功能是什么。
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
请尝试使用代码,而不是文字,因为我的英语不是很好,谢谢
答案 0 :(得分:1)
迭代器可以迭代:
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
答案 1 :(得分:0)
HttpResponse
是一个可以存储字符串数据的类。数据存储在名为_container
的成员变量中。
假设hr
是HttpResponse
的实例,其中包含数据。当你调用iter(hr)
时,你应该回到迭代器。此迭代器将从_container
成员变量返回数据。
此类“包装”_container
成员,以便它始终返回非Unicode文本。因为此类具有__iter__()
方法函数,所以当您调用iter()
时,您实际上正在调用特殊的__iter__()
方法函数。此方法函数实际上会在iter()
成员变量上调用_container
来获取其内容的迭代器。但是它会将此迭代器保存在_iterator
成员变量中,并返回self
。现在可以迭代了。
定义了next()
方法函数。如果_container
变量的类型是Unicode,则调用encode()
以某种编码对Unicode进行编码并返回非Unicode。它使用另一个成员变量_charset
来知道要用于编码的字符集。如果container
变量的类型不是Unicode,则它必须是普通的字符串类型,并且数据只是保持不变。
通过这种方式,可以迭代此类中的“包装”对象,并始终返回非Unicode文本。
我对迭代器协议的这种实现感到惊讶。当它向你返回一个迭代器时,它只是返回self
,所以如果你两次调用iter()
,你实际上并没有得到两个可用的迭代器。这似乎很危险。我猜Django代码从来没有做过这样的事情。