Python 将iterables链接到新对象中,但保留其类?

Python 将iterables链接到新对象中,但保留其类?,python,oop,itertools,chain,database-cursor,Python,Oop,Itertools,Chain,Database Cursor,我正在使用Python中的游标对象,它基本上是一个迭代器。我实际上有两个,需要连成一个。这些对象有一些我需要在程序中进一步使用的方法。问题是itertools.chain(它基本上完成了这项工作)返回一个chain对象,而我没有访问cursor方法的权限 有没有办法保持其原始类,使其成为一个新对象(两个对象中的一个链接),但拥有所有初始方法?您可以自己创建一些链接逻辑。假设您有两个不同类的迭代器,Foo和Bar: class Foo: def __init__(self, n):

我正在使用Python中的游标对象,它基本上是一个迭代器。我实际上有两个,需要连成一个。这些对象有一些我需要在程序中进一步使用的方法。问题是itertools.chain(它基本上完成了这项工作)返回一个chain对象,而我没有访问cursor方法的权限


有没有办法保持其原始类,使其成为一个新对象(两个对象中的一个链接),但拥有所有初始方法?

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

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\u method()
,而Bar迭代器有
.Bar\u 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

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

感谢您发布解决方案。它基本上是可以工作的,但我现在面临的问题是,当我调用游标对象方法时,它会为单个对象调用它。假设我有两个游标对象,分别有13项和44项。当我调用.count()时,它将返回13。我可以在Chain类中重新定义count()方法,但我还有其他方法,如limit()和skip(),它们更难重新定义。有没有一种方法可以处理像由两个游标对象组成的组合对象这样的链式对象?这很难,因为它需要包装器类中的知识来了解链式对象中调用的方法的确切用途。假设您的对象有
.empty()
方法和
.nonempty()
方法和
.count()
方法和
.peek()
方法——包装器中的相应实现应该为每一个方法做什么?恐怕您需要分别重新定义包装中的每一项。您觉得这是唯一的选择吗?有没有其他办法来解决这个问题?