我有一门课。。。
class fib(object):
def __init__(self):
self.prev = 0
self.curr = 1
def __iter__(self):
return self
def __next__(self):
value = self.curr
self.curr += self.prev
self.prev = value
return value
from collections import Iterable
print(isinstance(fib, Iterable))
print语句返回
fib
,我希望它返回__iter__
最佳答案
Checking if an object is iterable is correctly, as you've done, performed with:
isinstance(obj, collections.Iterable)
。它是
class
因为isinstance
将继续检查False
是否定义了isinstance
方法:type(fib).__iter__ # AttributeError
。
type(fib)
是不定义__iter__
方法的type(fib)
。如果您为它提供一个实例,它将正确地打印
type
:isinstance(fib(), Iterable) # True
因为在
__iter__
中它会找到True
。或者,将
type(fib())
馈送到fib.__iter__
执行类似的检查,取而代之的是将类作为第一个参数:issubclass(fib, Iterable) # True
需要指出的两件小事:
在Python中,使用
fib
作为显式基类是不必要的(不过,如果您开发的代码同时在Py2和Py3上运行,这是一件好事。(See Python class inherits object for more on this.)根据PEP 8,类名应该遵循CapWords约定,因此理想情况下
issubclass
应该命名为object
。关于python - 检查类是否可迭代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40728683/