Python 检查类是否可编辑

Python 检查类是否可编辑,python,class,python-3.x,iterable,Python,Class,Python 3.x,Iterable,我有一个类fib,如下所示。它实现了\uuuuu iter\uuuuu和\uuuu next\uuuuuu。它是一个iterable以及它自己的迭代器 class fib(object): def __init__(self): self.prev = 0 self.curr = 1 def __iter__(self): return self def __next__(self): value = s

我有一个类
fib
,如下所示。它实现了
\uuuuu iter\uuuuu
\uuuu next\uuuuuu
。它是一个iterable以及它自己的迭代器

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

检查一个对象是否正确,正如您所做的那样,是通过以下方式执行的:

isinstance(obj, collections.Iterable)
这里的问题是,您向
isinstance
提供的是
类,而不是实例。它是
False
,因为
isinstance
将继续检查
type(fib)
是否定义了
\iter\uuu
方法:

type(fib).__iter__  # AttributeError
当然,事实并非如此<代码>类型(fib)
类型
,它没有定义
方法

如果向其提供实例,它将正确打印
True

isinstance(fib(), Iterable)  # True
因为在
type(fib())
中查找,它将找到
fib.\uuuu iter\uuuu

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

issubclass(fib, Iterable)    # True
需要指出的另外两件小事:

  • 在Python
    3
    中,使用
    object
    作为显式基类是不必要的(不过,如果您正在开发同时在Py2和Py3上运行的代码,这是一件好事。(有关详细信息,请参阅。)
  • 根据PEP 8,类名应遵循大写字母惯例,因此理想情况下应将
    fib
    命名为
    fib

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