我想知道为什么isinstance
函数与collections.Iterable
一起使用,以检查对象是否不是Iterable
的子类。
如果我们有两个班级:
class first_class(object):
pass
class second_class(object):
def __iter__(self):
pass
呼叫ininstance(first_class(), Iterable)
会返回False
。
呼叫isinstance(second_class(), Iterable)
会返回True
。
isinstance
的文档中说:“返回对象是类的实例还是其子类的实例。”
因为两个类都是object
的子类,为什么一个返回它是Iterable
的子类,而另一个却不是呢?
我知道这是由于__iter__
方法引起的,但是如果两个类的继承相同,我不明白为什么它会影响isinstance
的结果。
尝试以下操作时,我会更加困惑:
x = first_class()
x.__iter__ = lambda: None
如果添加__iter__
方法使second_class变得可迭代,为什么在上面添加了__iter__
方法的代码之后,isinstance(x, Iterable)
仍返回False
?