我想重写在外部库中定义的ExternalIter的ExternalIter方法,因此我不能更改ExternalIter类的源代码。我在MyIter2和MyIter3中实现了两种不同的重写方法。
class ExternalIter:
def __init__(self):
self.x = iter([
(1, 2),
(3, 4),
(5, 6),
(7, 8),
(9, 10)
])
def __iter__(self):
return self
def __next__(self):
return next(self.x)
class MyIter2(ExternalIter):
def __iter__(self):
while True:
try:
i, j = super().__next__()
yield i
yield j
except StopIteration:
break
class MyIter3(ExternalIter):
def __iter__(self):
for i, j in super().__iter__():
yield i
yield jExternalIter的原始行为如下:
for i in ExternalIter():
print(i)
# (1, 2)
# (3, 4)
# (5, 6)
# (7, 8)
# (9, 10)我希望覆盖__iter__的行为,如下面的示例所示:
for i in MyIter2():
print(i)
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10MyIter2作为例外。但是,像我在MyIter3中所做的那样,另一种重写方法会抛出RecursionError。
for i in MyIter3():
print(i)
---------------------------------------------------------------------------
RecursionError Traceback (most recent call last)
<ipython-input-8-4e1114201cac> in <module>
----> 1 for i in MyIter3():
2 print(i)
<ipython-input-5-82da3324a8a3> in __iter__(self)
30
31 def __iter__(self):
---> 32 for i, j in super().__iter__():
33 yield i
34 yield j
... last 1 frames repeated, from the frame below ...
<ipython-input-5-82da3324a8a3> in __iter__(self)
30
31 def __iter__(self):
---> 32 for i, j in super().__iter__():
33 yield i
34 yield j
RecursionError: maximum recursion depth exceeded while calling a Python object您能解释为什么第一种方法有效时,第二种实现会抛出错误吗?如何在不获取__iter__的情况下使用super().__iter__()覆盖RecursionError
您能否解释__iter__如何在继承的上下文中工作,以理解为什么super().__iter__()引用的是self,而不是父?
发布于 2020-08-12 17:11:22
super().__iter__()在for循环进行自己的隐式iter(self)调用之前返回self,该调用启动无限递归。
由于for循环的工作方式,我在这里没有看到任何使用方法。您可以使用显式while循环来避免对__iter__的调用。
def __iter__(self):
while True:
try:
i, j = next(self)
except StopIteration:
break
yield i
yield j这并不是将self视为一个可迭代的,而是一个迭代器。
https://stackoverflow.com/questions/63381216
复制相似问题