将可迭代对象链接到一个新对象中但保留它们的 class?
Chain iterables into a new object but keep their class?
我在 Python 中使用游标对象,它基本上是一个迭代器。我实际上有两个,需要链接成一个。这些对象有一些我需要在程序中进一步使用的方法。问题是 itertools.chain(基本上完成了工作)returns 一个链对象,我无权访问游标方法。
有没有办法保留其原始 class 以便它成为一个新对象(由两个链接而成)但具有所有初始方法?
您可以自己创建一些链接逻辑。假设您有两个不同 classes 的迭代器,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_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,但它确实允许您访问链中“当前”迭代器的所有方法。
我在 Python 中使用游标对象,它基本上是一个迭代器。我实际上有两个,需要链接成一个。这些对象有一些我需要在程序中进一步使用的方法。问题是 itertools.chain(基本上完成了工作)returns 一个链对象,我无权访问游标方法。
有没有办法保留其原始 class 以便它成为一个新对象(由两个链接而成)但具有所有初始方法?
您可以自己创建一些链接逻辑。假设您有两个不同 classes 的迭代器,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_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,但它确实允许您访问链中“当前”迭代器的所有方法。