如何修改OrderLine类实现无需类型判断即可统一遍历处理元素
实现方案
只需要给OrderLine类实现迭代器协议,自定义__iter__方法,让单个实例迭代时仅返回自身一次即可,修改后的代码如下:
class OrderLine: def __iter__(self): # 迭代时仅返回自身一次,匹配for循环的预期行为 yield self
效果验证
你原来的业务代码不需要做任何类型判断,直接按目标写法遍历即可:
class OrderLine: def __iter__(self): yield self # 测试数据:同时包含单个实例和子列表 lines = [OrderLine(), [OrderLine(), OrderLine()]] def process_line(line): # 这里可替换为你的实际业务逻辑 print(f"执行订单行处理,实例ID:{id(line)}") # 遍历第一个元素(单个OrderLine实例),循环执行1次 index = 0 line = lines[index] for _line in line: process_line(_line) # 遍历第二个元素(OrderLine子列表),循环执行2次 index = 1 line = lines[index] for _line in line: process_line(_line)
实现原理
Python的for循环本质依赖迭代器协议:会先调用遍历对象的__iter__()方法获取迭代器,再重复调用next()方法取值,直到抛出StopIteration异常终止循环。我们给OrderLine实现的__iter__是生成器方法,仅yield一次自身,因此单个实例遍历时只会返回一次自身,和列表遍历行为对齐,完全省略了额外的类型判断步骤。
内容的提问来源于stack exchange,提问作者user17189165
相关产品推荐
相关产品推荐

