Python使用自定义类实现电话簿lookup查询报错问题求解
问题解决
错误原因
- 没有持久存储联系人数据:你当前只是把联系人实例赋值给了每次循环都会重新生成的临时列表
segment的元素,add操作结束后本次循环的segment就会被销毁,后续lookup操作根本拿不到之前添加的联系人数据 - lookup逻辑错误:你直接读取输入的姓名字符串的
number属性,字符串本身不存在该属性,自然会报错
修复后代码
class People: def __init__(self, name, number): self.name = name self.number = number def main(): # 用字典存储姓名到联系人实例的映射,全局生效 contact_map = {} while True: command = input('phoneBook> ') segments = command.strip().split() if not segments: print("有效命令:add 姓名 手机号 / lookup 姓名 / quit") continue cmd = segments[0] if cmd == 'add': if len(segments) != 3: print("add命令用法:add 姓名 手机号") continue name, phone = segments[1], segments[2] contact_map[name] = People(name, phone) print(f"已添加联系人 {name},手机号:{contact_map[name].number}") elif cmd == 'lookup': if len(segments) != 2: print("lookup命令用法:lookup 姓名") continue name = segments[1] if name in contact_map: print(f"{name} 的手机号:{contact_map[name].number}") else: print(f"联系人 {name} 不存在") elif cmd == 'quit': print("程序退出") break else: print("未知命令,支持的命令:add、lookup、quit") if __name__ == '__main__': main()
优化建议
- 命名规范:Python类名默认使用大驼峰格式,原
people改为People更符合通用编码规范 - 异常兼容:新增了命令格式校验、不存在的联系人查询提示,避免程序直接崩溃
- 功能扩展:可以基于现有
contact_map扩展删除联系人、修改手机号、批量导入导出联系人等功能 - 持久化存储:如果需要重启程序后仍保留联系人数据,可以把
contact_map的内容序列化写入本地json、csv文件,程序启动时再读取加载
内容的提问来源于stack exchange,提问作者user11582989
相关产品推荐
相关产品推荐

