我有一门课。。。

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/

10-12 22:19