Python 检查类是否可编辑
我有一个类Python 检查类是否可编辑,python,class,python-3.x,iterable,Python,Class,Python 3.x,Iterable,我有一个类fib,如下所示。它实现了\uuuuu iter\uuuuu和\uuuu next\uuuuuu。它是一个iterable以及它自己的迭代器 class fib(object): def __init__(self): self.prev = 0 self.curr = 1 def __iter__(self): return self def __next__(self): value = s
fib
,如下所示。它实现了\uuuuu iter\uuuuu
和\uuuu next\uuuuuu
。它是一个iterable以及它自己的迭代器
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语句返回
False
,我希望它返回True
检查一个对象是否正确,正如您所做的那样,是通过以下方式执行的:
isinstance(obj, collections.Iterable)
这里的问题是,您向isinstance
提供的是类,而不是实例。它是False
,因为isinstance
将继续检查type(fib)
是否定义了\iter\uuu
方法:
type(fib).__iter__ # AttributeError
当然,事实并非如此<代码>类型(fib)
是类型
,它没有定义方法
如果向其提供实例,它将正确打印True
:
isinstance(fib(), Iterable) # True
因为在type(fib())
中查找,它将找到fib.\uuuu iter\uuuu
或者,将fib
馈送到issubclass
执行类似的检查,取而代之的是将类作为第一个参数:
issubclass(fib, Iterable) # True
需要指出的另外两件小事:
- 在Python
3
中,使用object
作为显式基类是不必要的(不过,如果您正在开发同时在Py2和Py3上运行的代码,这是一件好事。(有关详细信息,请参阅。)
- 根据PEP 8,类名应遵循大写字母惯例,因此理想情况下应将
fib
命名为fib
fib
是类,而不是实例。因此,您可以使用子类检查issubclass(fib,Iterable)
。或者您首先创建一个实例:isinstance(fib(),Iterable)
——这是用小写字符开始类名的结果;fib
是不Iterable的fib
是一个实例可写的类。尝试迭代fib本身就像尝试吃汉堡的概念一样。