当我写时,我不明白为什么在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”会出现在控制台中
这是因为
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