Как работает collection.Iterable с isinstance ()? - PullRequest
0 голосов
/ 18 февраля 2019

Мне было интересно, почему функция 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...