检查 class 是否可迭代
Checking if a class is iterable
我有一个 class fib
下面给出。它实现了 __iter__
和 __next__
。它是可迭代的,也是它自己的迭代器。
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))
打印语句 returns False
,我希望它是 return True
检查一个对象是否可迭代是正确的,正如你所做的那样,执行了:
isinstance(obj, collections.Iterable)
这里的问题是您提供的是 class
到 isinstance
而不是实例。它是 False
因为 isinstance
将继续检查 type(fib)
是否定义了 __iter__
方法:
type(fib).__iter__ # AttributeError
当然不是这样的。 type(fib)
是 type
,它没有定义 __iter__
方法。
如果您向它提供实例,它会正确打印 True
:
isinstance(fib(), Iterable) # True
因为在 type(fib())
中查找会发现 fib.__iter__
.
或者,将 fib
馈送到 issubclass
执行类似的检查,而是将 class 作为第一个参数:
issubclass(fib, Iterable) # True
需要指出两件额外的小事:
- 使用
object
作为显式基础 class 在 Python 3
中是不必要的(但是,如果您正在开发同时在 Py2 和 Py3 上运行的代码,这是一件好事。(有关更多信息,请参阅 Python class inherits object。)
- 根据 PEP 8,class 名称应遵循 CapWords 约定,因此
fib
最好命名为 Fib
。
我有一个 class fib
下面给出。它实现了 __iter__
和 __next__
。它是可迭代的,也是它自己的迭代器。
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))
打印语句 returns False
,我希望它是 return True
检查一个对象是否可迭代是正确的,正如你所做的那样,执行了:
isinstance(obj, collections.Iterable)
这里的问题是您提供的是 class
到 isinstance
而不是实例。它是 False
因为 isinstance
将继续检查 type(fib)
是否定义了 __iter__
方法:
type(fib).__iter__ # AttributeError
当然不是这样的。 type(fib)
是 type
,它没有定义 __iter__
方法。
如果您向它提供实例,它会正确打印 True
:
isinstance(fib(), Iterable) # True
因为在 type(fib())
中查找会发现 fib.__iter__
.
或者,将 fib
馈送到 issubclass
执行类似的检查,而是将 class 作为第一个参数:
issubclass(fib, Iterable) # True
需要指出两件额外的小事:
- 使用
object
作为显式基础 class 在 Python3
中是不必要的(但是,如果您正在开发同时在 Py2 和 Py3 上运行的代码,这是一件好事。(有关更多信息,请参阅 Python class inherits object。) - 根据 PEP 8,class 名称应遵循 CapWords 约定,因此
fib
最好命名为Fib
。