Python自定义EvenNumbers迭代器运行while循环报num属性不存在错误如何解决
报错触发原因
- 核心问题是自定义迭代器类中
__iter__方法的名称书写错误:你写的是单下划线包裹的_iter_,Python 要求迭代器协议的魔术方法必须是前后双下划线包裹的__iter__,因此迭代器初始化时该方法根本没有被调用,self.num属性从未被创建,调用__next__方法访问self.num时就触发了属性不存在的报错。 - 同时代码存在隐藏错误:末尾的入口判断
if __name__ == '_main_'同样是单下划线的错误写法,正确格式应为__main__,修复第一个问题后这个错误会触发执行入口不生效的问题。
修复方案
修改两处魔术方法的下划线格式即可,遵循迭代器协议的前提下,也可以在手动调用next前先执行iter()初始化迭代状态,修正后的完整代码如下:
import time class EvenNumbers: def __init__(self, max=None): self.max = max # 修正为双下划线包裹的__iter__ def __iter__(self): self.num = 0 return self def __next__(self): if not self.max or self.num <= self.max: result = self.num self.num += 2 return result else: raise StopIteration def run(): evennumbers = EvenNumbers(5) # 手动触发迭代器初始化,等价于for循环自动执行的逻辑 evennumbers = iter(evennumbers) while True: try: element = next(evennumbers) print(element) time.sleep(0.5) except StopIteration: break # 修正为双下划线包裹的__main__ if __name__ == '__main__': run()
修复后运行代码会依次输出0、2、4,符合偶数迭代器的预期效果。
内容的提问来源于stack exchange,提问作者Bruno Cornelio
相关产品推荐
相关产品推荐

