liv*_*hak 2 python iterable class python-3.x
我有一个fib下面给出的课程.它实现__iter__和__next__.它是一个可迭代的,也是它自己的迭代器.
class fib(object):
def __init__(self):
self.prev = 0
self.curr = 1
def __iter__(self):
return self
def __next__(self):
value = self.curr
self.curr += self.prev
self.prev = value
return value
from collections import Iterable
print(isinstance(fib, Iterable))
Run Code Online (Sandbox Code Playgroud)
print语句返回False,我希望它返回True
正如您所做的那样,检查对象是否可迭代正确执行:
isinstance(obj, collections.Iterable)
Run Code Online (Sandbox Code Playgroud)
这里的问题是你提供一个class到isinstance,而不是一个实例.这是False因为isinstance将继续并检查是否定义type(fib)了一个__iter__方法:
type(fib).__iter__ # AttributeError
Run Code Online (Sandbox Code Playgroud)
当然,情况并非如此.type(fib)是type没有定义__iter__方法的.
如果您提供实例,它会正确打印True:
isinstance(fib(), Iterable) # True
Run Code Online (Sandbox Code Playgroud)
因为看着type(fib())就会发现fib.__iter__.
或者,喂食fib以issubclass执行类似的检查,而是将类作为第一个参数:
issubclass(fib, Iterable) # True
Run Code Online (Sandbox Code Playgroud)
另外两件小事要指出:
object在Python中使用作为显式基类是不必要的3(但是,如果您正在开发在Py2和Py3上运行的代码,那么这是一件好事.(请参阅Python类继承对象以获取更多信息.)fib理想情况下应该命名Fib.