2016-11-21 108 views
1

我有一个类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)) 

print语句返回False,我希望它返回True

+1

'fib'是* class *,不是实例。所以你可以使用子类检查'issubclass(fib,Iterable)'。或者你首先创建一个实例:'isinstance(fib(),Iterable)' - 这就是你用小写字符开始你的类名得到的结果;) – poke

+0

'fib'是不可迭代的。 'fib'是一个实例可迭代的类。尝试迭代“fib”本身就像尝试吃汉堡的概念。 – user2357112

回答

4

检查对象是否可迭代是正确的,因为你所做的,与执行:

isinstance(obj, collections.Iterable) 

的这里的问题是你提供classisinstance而不是一个实例。这是因为Falseisinstance继续前进,检查是否有type(fib)定义的__iter__方法:

type(fib).__iter__ # AttributeError 

这当然并非如此。 type(fib)type,它没有定义__iter__方法。

如果你提供一个实例,它打印正确True

isinstance(fib(), Iterable) # True 

因为在寻找type(fib())它会找到fib.__iter__

另外,饲养fibissubclass执行类似的检查,而是采用一个类作为第一个参数:

issubclass(fib, Iterable) # True 

两个额外的小事指出:

  • 使用object为在Python 3中不需要明确的基类(尽管如果您正在开发在Py2和Py3上运行的代码,这是件好事。)
  • 根据PEP 8,类名应遵循CapWords约定,所以fib理想情况下应该命名为Fib
相关问题