代码之家  ›  专栏  ›  技术社区  ›  Jason Baker

我如何子类集合。迭代器?

  •  2
  • Jason Baker  · 技术社区  · 14 年前

    根据关于 ABCs ,我只需要添加一个 next 方法可以子类化 collections.Iterator . 因此,我使用以下类:

    class DummyClass(collections.Iterator):
        def next(self):
            return 1
    

    >>> x = DummyClass()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Can't instantiate abstract class DummyClass with abstract methods __next__
    

    我猜我在做傻事,但我搞不懂是什么。有人能解释一下吗?我可以加一个 __next__ 方法,但我的印象是只针对C类。

    1 回复  |  直到 14 年前
        1
  •  8
  •   Eric C    9 年前

    >>> import collections
    >>> class DummyClass(collections.Iterator):
    ...     def next(self):
    ...         return 1
    ... 
    >>> x = DummyClass()
    >>> zip(x, [1,2,3,4])
    [(1, 1), (1, 2), (1, 3), (1, 4)]
    

    但是在Python3.x上,应该实现 __next__ next ,如表 the py3k doc

    >>> import collections
    >>> class DummyClass(collections.Iterator):
    ...     def next(self):
    ...         return 1
    ... 
    >>> x = DummyClass()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Can’t instantiate abstract class DummyClass with abstract methods __next__
    >>> class DummyClass3k(collections.Iterator):
    ...     def __next__(self):
    ...         return 2
    ... 
    >>> y = DummyClass3k()
    >>> list(zip(y, [1,2,3,4]))
    [(2, 1), (2, 2), (2, 3), (2, 4)]
    

    这一变化是由 PEP-3114 — Renaming iterator.next() to iterator.__next__()

    推荐文章