我试图弄清楚为什么下面的例子不起作用。
class BaseClass(object):
def __init__(self):
self.count = 1
def __iter__(self):
return self
def next(self):
if self.count:
self.count -= 1
return self
else:
raise StopIteration
class DerivedNO(BaseClass):
pass
class DerivedO(BaseClass):
def __init__(self):
self.new_count = 2
self.next = self.new_next
def new_next(self):
if self.new_count:
self.new_count -= 1
return None
else:
raise StopIteration
x = DerivedNO()
y = DerivedO()
print x
print list(x)
print y
print list(y)
这是输出:
<__main__.DerivedNO object at 0x7fb2af7d1c90>
[<__main__.DerivedNO object at 0x7fb2af7d1c90>]
<__main__.DerivedO object at 0x7fb2af7d1d10>
Traceback (most recent call last):
File "playground.py", line 41, in <module>
print list(y)
File "playground.py", line 11, in next
if self.count:
AttributeError: 'DerivedO' object has no attribute 'count'
如您所见,DerivedO
当我尝试next()
在__init__
. 这是为什么?对 next 的简单调用可以正常工作,但在使用迭代技术时根本不行。
编辑:我意识到我的问题并不完全清楚。AttributeError 不是我要解决的问题。但它确实表明它next()
被调用BaseClass
而不是DerivedO
像我想象的那样被调用。