为什么Python在使用map.__mro__时不将迭代器类放在__mro__中,而是将map视为迭代器的子类?

问题描述 投票:0回答:1

当我写时,我不明白为什么在Python中:

from collections.abc import *
  print(map.__mro__)
  print(issubclass(map,Iterator))

我得到的输出是:

(<class 'map'>, <class 'object'>)
True

但是map.___mro___的返回中并没有显示迭代器类,为什么会出现这种情况呢?它与mro如何工作有关?

当我编写 print(map.___mro___) 时,我预计“class Iterator”会出现在控制台中

python
1个回答
1
投票

这是因为

collections.abc.Iterator
实现了
__subclasshook__
方法,只要给定类定义了 __iter__
__next__
方法,
就将
视为其子类:

class Iterator(Iterable):

    __slots__ = ()

    @abstractmethod
    def __next__(self):
        'Return the next item from the iterator. When exhausted, raise StopIteration'
        raise StopIteration

    def __iter__(self):
        return self

    @classmethod
    def __subclasshook__(cls, C):
        if cls is Iterator:
            return _check_methods(C, '__iter__', '__next__')
        return NotImplemented
© www.soinside.com 2019 - 2024. All rights reserved.