【问题标题】:Checking if a class is iterable [duplicate]检查一个类是否是可迭代的[重复]
【发布时间】:2017-04-05 08:24:51
【问题描述】:

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

打印语句返回False,我希望它返回True

【问题讨论】:

  • fib,而不是实例。所以你会使用子类检查issubclass(fib, Iterable)。或者你先创建一个实例:isinstance(fib(), Iterable)——这就是你用小写字符开始你的类名的结果;)
  • fib 不可迭代。 fib 是一个实例可迭代的类。尝试迭代 fib 本身就像尝试吃汉堡的概念。

标签: python class python-3.x iterable


【解决方案1】:

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

isinstance(obj, collections.Iterable)

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

type(fib).__iter__  # AttributeError

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

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

isinstance(fib(), Iterable)  # True

因为查看type(fib()) 会找到fib.__iter__

或者,将fib 提供给issubclass 执行类似的检查,而是将类作为第一个参数:

issubclass(fib, Iterable)    # True

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

  • 在 Python 3 中不需要使用 object 作为显式基类(不过,如果您正在开发在 Py2 和 Py3 上运行的代码,这是一件好事。(有关更多信息,请参阅 Python class inherits object这个。)
  • 根据 PEP 8,类名应遵循 CapWords 约定,因此理想情况下应将 fib 命名为 Fib

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2013-09-23
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2016-05-26
    • 2011-03-02
    相关资源
    最近更新 更多