创建以client id为键的类对象字典时遇值覆盖问题求助
问题原因
你反复复用了同一个client_new对象,两次调用enter_client_info()都是在修改这个对象的属性——字典里的两个键(1和2)其实指向的是同一个实例,所以不管取哪个键,拿到的都是最后输入的那组数据。
另外你的Client类代码还有两处小问题:
- 缺少
class Client:的类定义头,这会导致代码无法正常运行 id_iter作为全局变量不够合理,改成类属性能避免全局命名污染,还能让所有Client实例共享同一个ID迭代器
修正后的完整代码
第一步:修复Client类
import itertools class Client: # 把ID迭代器设为类属性,所有实例共享,从1开始计数更符合常规习惯 id_iter = itertools.count(start=1) def __init__(self): self.cl_id = 0 self.surname = "" self.name = "" self.phone = "" self.address = "" self.email = "" self.afm = "" def enter_client_info(self): self.cl_id = next(self.id_iter) self.surname = input("Enter client surname: ") self.name = input("Enter client name: ") self.phone = input("Enter client phone: ") self.address = input("Enter client address: ") self.email = input("Enter client email: ") self.afm = input("Enter client afm: ")
第二步:正确创建多个客户端
# 建议把变量名改成client_dict,更贴合字典的语义 client_dict = {} # 创建第一个客户端:生成新实例 new_client = Client() new_client.enter_client_info() client_dict[new_client.cl_id] = new_client # 创建第二个客户端:必须重新生成新实例,不能复用之前的对象 new_client = Client() new_client.enter_client_info() client_dict[new_client.cl_id] = new_client # 现在测试就能得到正确结果 print(client_dict[1].name) print(client_dict[2].surname)
额外优化小技巧
- 可以给
enter_client_info添加返回值,简化创建和添加的代码:
def enter_client_info(self): self.cl_id = next(self.id_iter) self.surname = input("Enter client surname: ") self.name = input("Enter client name: ") self.phone = input("Enter client phone: ") self.address = input("Enter client address: ") self.email = input("Enter client email: ") self.afm = input("Enter client afm: ") return self # 返回实例本身 # 简化后的添加逻辑 client_dict = {} new_client = Client().enter_client_info() client_dict[new_client.cl_id] = new_client
内容的提问来源于stack exchange,提问作者DarkSide
相关产品推荐
相关产品推荐

