Мне было интересно, почему функция 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 является экземпляром класса или его подкласса ".
Поскольку оба класса являются подклассами object
, почему один возвращает, что это подкласс Iterable
, а другой - нет?
Я понял, что это из-за метода __iter__
, но я не понимаю, почему он влияет на результат isinstance
, если наследование одинаково в обоих классах.
Я запутался, когда попробовал следующее:
x = first_class()
x.__iter__ = lambda: None
Если добавление метода __iter__
сделало second_class итерируемым, почему после вышеприведенного кода, который добавил метод __iter__
, isinstance(x, Iterable)
все ещевозврат False
?