检查 class 是否可迭代

Checking if a class is iterable

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

打印语句 returns False,我希望它是 return True

检查一个对象是否可迭代是正确的,正如你所做的那样,执行了:

isinstance(obj, collections.Iterable)

这里的问题是您提供的是 classisinstance 而不是实例。它是 False 因为 isinstance 将继续检查 type(fib) 是否定义了 __iter__ 方法:

type(fib).__iter__  # AttributeError

当然不是这样的。 type(fib)type,它没有定义 __iter__ 方法。

如果您向它提供实例,它会正确打印 True:

isinstance(fib(), Iterable)  # True

因为在 type(fib()) 中查找会发现 fib.__iter__.

或者,将 fib 馈送到 issubclass 执行类似的检查,而是将 class 作为第一个参数:

issubclass(fib, Iterable)    # True

需要指出两件额外的小事:

  • 使用 object 作为显式基础 class 在 Python 3 中是不必要的(但是,如果您正在开发同时在 Py2 和 Py3 上运行的代码,这是一件好事。(有关更多信息,请参阅 Python class inherits object。)
  • 根据 PEP 8,class 名称应遵循 CapWords 约定,因此 fib 最好命名为 Fib