检查类是否可迭代

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

Jim*_*ard 9

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

isinstance(obj, collections.Iterable)
Run Code Online (Sandbox Code Playgroud)

这里的问题是你提供一个classisinstance,而不是一个实例.这是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__.

或者,喂食fibissubclass执行类似的检查,而是将类作为第一个参数:

issubclass(fib, Iterable)    # True
Run Code Online (Sandbox Code Playgroud)

另外两件小事要指出:

  • object在Python中使用作为显式基类是不必要的3(但是,如果您正在开发在Py2和Py3上运行的代码,那么这是一件好事.(请参阅Python类继承对象以获取更多信息.)
  • 根据PEP 8,类名应遵循CapWords惯例,因此fib理想情况下应该命名Fib.