在Python中查看实例的类层次结构

时间:2014-10-27 14:32:02

标签: python oop iterator generator

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。

所以这两个问题,谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

Python中没有任何内容继承自IteratorIterable,因为它们体现了协议。 Python查找__iter__ and __next__ methods,而不是特定的基类。任何对象都可以是迭代或迭代器,只需实现这些方法即可。

zip()是C代码中定义的内置函数,它遵循所有内置函数的命名约定;这些总是小写的;它返回的类型并不是所有相关的,而是遵循函数名称。

collections.abc.Iterablecollections.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