将可迭代对象链接到一个新对象中但保留它们的 class?

Chain iterables into a new object but keep their class?

我在 Python 中使用游标对象,它基本上是一个迭代器。我实际上有两个,需要链接成一个。这些对象有一些我需要在程序中进一步使用的方法。问题是 itertools.chain(基本上完成了工作)returns 一个链对象,我无权访问游标方法。

有没有办法保留其原始 class 以便它成为一个新对象(由两个链接而成)但具有所有初始方法?

您可以自己创建一些链接逻辑。假设您有两个不同 classes 的迭代器,FooBar:

class Foo:
    def __init__(self, n):
        self._iter = ((i * i for i in range(n)))
    def __next__(self):
        return next(self._iter)
    def foo_method(self):
        print("Yay, method in Foo was called")


class Bar:
    def __init__(self, n):
        self._iter = ((i / 2 for i in range(n)))
    def __next__(self):
        return next(self._iter)
    def bar_method(self):
        print("Yay, method in Bar was called")

Foo 迭代器有 .foo_method() 和 Bar 迭代器有 .bar_method().

现在让我们将它们链接在一起:

class Chain:
    def __init__(self, *iters):
        self._cursor = 0
        self._iters = iters
    def __next__(self):
        """
        Chain iterators together.
        """
        if self._cursor == len(self._iters):
            raise StopIteration
        try:
            return next(self._iters[self._cursor])
        except StopIteration:
            self._cursor += 1
            return next(self)
    def __getattr__(self, name):
        """
        Pass everything unknown to the current iterator in chain.
        """
        if self._cursor == len(self._iters):
            raise ValueError("No current iterator")
        return getattr(self._iters[self._cursor], name)

现在如果你做类似的事情

foo = Foo(3)
bar = Bar(3)

chain = Chain(foo, bar)

print(next(chain))
chain.foo_method()
print(next(chain))
print(next(chain))
print(next(chain))
print(next(chain))
chain.bar_method()

输出将是

0
Yay, method in Foo was called
1
4
0.0
0.5
Yay, method in Bar was called

这不会保留迭代器的 class,但它确实允许您访问链中“当前”迭代器的所有方法。