You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:54:04