如何用if语句添加对象?解决车辆添加的AttributeError报错
问题解决:车辆管理方法的错误修正
让我来帮你分析并解决这个问题,你的代码里存在几个逻辑错误和参数问题,我们一步步拆解并修正:
首先看报错原因
你遇到的 AttributeError: 'str' object has no attribute 'nome' 是因为调用add_viatura方法时传入了字符串,而不是Viatura类的实例。除此之外,你的两个方法还有其他逻辑问题,我们一起修复。
1. 修复exists_viatura方法的逻辑错误
原来的方法会在第一个不匹配的车辆就打印提示,这不符合需求——应该是遍历完所有车辆都没找到时才提示不存在。修正后的代码:
def exists_viatura(self, nome): for v in self.gestor: if v.nome == nome: return True # 遍历完所有车辆都没找到,才打印提示并返回False print("Não existe nenhuma viatura") return False
2. 修复add_viatura方法的多重问题
原来的方法存在循环内重复创建实例、错误调用外部对象方法、验证逻辑顺序错误等问题,修正后的代码:
def add_viatura(self, new_v): # 先校验传入参数是否为Viatura实例,从源头避免类型错误 if not isinstance(new_v, Viatura): print("Erro: O parâmetro deve ser uma instância de Viatura") return # 调用当前Gestor实例的exists_viatura方法,检查是否重名 if self.exists_viatura(new_v.nome): print("Já existe uma viatura com esse nome") return # 确认无重复后,添加到管理列表 self.gestor.append(new_v)
3. 正确的调用方式
确保调用add_viatura时传入的是Viatura对象,而不是字符串:
# 创建一个Viatura实例 nova_viatura = Viatura("E-Bike Pro", "Modelo 2024", True, 1200.0) # 创建Gestor实例 meu_gestor = Gestor() # 添加车辆(传入Viatura对象) meu_gestor.add_viatura(nova_viatura)
关键修正点总结
- 参数校验:新增
isinstance检查,避免传入非Viatura类型的参数,彻底解决你遇到的AttributeError。 - exists_viatura逻辑优化:把提示信息和返回False的逻辑移到循环外,确保只有完全找不到匹配车辆时才提示。
- 移除冗余代码:删除循环内重复创建
new_v实例的无用代码,直接使用传入的对象。 - 修正方法调用:把
g.exists_viatura改为self.exists_viatura,确保调用当前实例的方法,而不是未定义的外部对象。
这样修改后,你的方法就能正确验证车辆是否存在,避免重复添加,同时解决了报错问题。
内容的提问来源于stack exchange,提问作者Sandra Silva
相关产品推荐
相关产品推荐

