以zip
为例。
我只想知道它是Iterable
还是Iterator
还是Generator
。
所以我把它放了:
zip(x,y).__class__
它打印:zip
为什么类名是小写的?
import inspect
inspect.getmro(zip)
zip.__base__
它打印:( zip,object)
这不可能。 Python文档说zip
会返回iterator
(或generator
?),但zip
显然不会根据getmro
打印的内容继承自Iterator或alikes。
所以这两个问题,谢谢你的帮助。
答案 0 :(得分:4)
Python中没有任何内容继承自Iterator
或Iterable
,因为它们体现了协议。 Python查找__iter__
and __next__
methods,而不是特定的基类。任何对象都可以是迭代或迭代器,只需实现这些方法即可。
zip()
是C代码中定义的内置函数,它遵循所有内置函数的命名约定;这些总是小写的;它返回的类型并不是所有相关的,而是遵循函数名称。
collections.abc.Iterable
和collections.abc.Iterator
类是抽象基类;如果您要测试的实例或子类实现了所需的方法,它们实现special hooks基本上返回True
。
zip()
都是可迭代的(它有__iter__
方法)和迭代器(__iter__
返回对象本身并且它有__next__
方法):
>>> from collections.abc import Iterator, Iterable
>>> zip_instance = zip('')
>>> type(zip_instance)
<class 'zip'>
>>> isinstance(zip_instance, Iterator)
True
>>> isinstance((zip_instance, Iterable)
True
>>> zip_instance.__iter__
<method-wrapper '__iter__' of zip object at 0x10f2d8348>
>>> zip_instance.__iter__() is zip_instance
True
>>> zip_instance.__next__
<method-wrapper '__next__' of zip object at 0x10f2d8348>
zip()
不是生成器,因为它没有任何special generator methods:
>>> hasattr(zip_instance, 'send')
False
>>> hasattr(zip_instance, 'throw')
False
>>> hasattr(zip_instance, 'close')
False