collections.Iterable 如何与 isinstance() 一起工作?

Kuz*_*nbo 6 python collections inheritance iterable python-3.x

我想知道为什么该isinstance函数collections.Iterable用于检查对象是否可迭代,如果它不是Iterable.

如果我们有两个类:

class first_class(object):
    pass

class second_class(object):
     def __iter__(self):
         pass
Run Code Online (Sandbox Code Playgroud)

调用ininstance(first_class(), Iterable)返回False

调用isinstance(second_class(), Iterable)返回True

的文档isinstance说:“返回对象是类的实例还是其子类的实例”。

因为两个类都是 的子类object,为什么一个会返回它是 的子类Iterable而另一个不是?

我知道这是因为__iter__方法,但我不明白为什么它会影响isinstance的结果,如果两个类中的继承相同。

当我尝试以下操作时,我变得更加困惑:

x = first_class()
x.__iter__ = lambda: None
Run Code Online (Sandbox Code Playgroud)

如果添加__iter__方法使 second_class 可迭代,为什么在上面添加__iter__方法的代码之后,isinstance(x, Iterable)仍然返回False