2016-11-21 112 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
相關問題