【发布时间】:2017-09-18 14:02:26
【问题描述】:
为什么我动态绑定到类实例的这个next方法失败并返回非迭代器对象?
from collections import Iterator
from collections import Iterable
from types import MethodType
def next(cls):
if cls.start < cls.stop:
cls.start += 1
return cls.start
else:
raise StopIteration
class Foo(object):
start, stop = 0, 5
def __iter__(self):
return self
if __name__ == "__main__":
foo = Foo()
setattr(foo, 'next', MethodType(next, foo, Foo))
print hasattr(foo, "next")
if isinstance(foo, Iterable):
print "iterable"
if isinstance(foo, Iterator):
print "iterator"
for i in foo:
print i
输出:
iterable
True
TypeError: iter() returned non-iterator of type 'Foo'
当我使用setattr(Foo, 'next', classmethod(next)) 时,它工作正常。
【问题讨论】:
-
这段代码到底应该做什么?
-
我想动态绑定next方法使其成为迭代器。
-
特殊方法,通常是
__double_underscored__名称,但在 Python 2 中也包括next(在 Python 3 中重命名为__next__),必须在类上定义,而不是在实例上定义.例如,动态添加__add__方法时会遇到类似问题。
标签: python python-2.7 iterator python-2.x python-internals