
本文讲解如何修改自定义字典类 Fit_Collection,使其支持为同一键(如 'project1')持续追加 Fit 实例到列表中,而非覆盖原有值,从而正确构建嵌套结构 {'project1': [fit1, fit2, fit3], 'project2': [fit11, fit22]}。
本文讲解如何修改自定义字典类 `fit_collection`,使其支持为同一键(如 `'project1'`)持续追加 `fit` 实例到列表中,而非覆盖原有值,从而正确构建嵌套结构 `{'project1': [fit1, fit2, fit3], 'project2': [fit11, fit22]}`。
核心问题在于:原始 Fit_Collection.fit() 方法直接执行 self[f.project_name] = f,将字典值设为单个 Fit 对象;当同一 project_name 多次调用时,后赋值会完全覆盖前值,导致最终只保留最后一个对象。
解决方案是——确保每个键对应一个列表,并在新增对象时执行追加操作。具体实现如下:
class Fit:
def __init__(self, name, project_name):
self.name = name
self.project_name = project_name
class Fit_Collection(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 使用更简洁的 super() 调用(Python 3)
def fit(self, *args, **kwargs):
f = Fit(*args, **kwargs)
key = f.project_name
if key in self:
self[key].append(f) # 键已存在:追加到现有列表
else:
self[key] = [f] # 键不存在:新建单元素列表
return f
使用示例:
project1 = ["fit1", "fit2", "fit3"]
project2 = ["fit11", "fit22"]
collection = Fit_Collection()
for name in project1:
collection.fit(name, "project1")
for name in project2:
collection.fit(name, "project2")
print(collection)
# 输出:{'project1': [<__main__.fit object at ...>, <__main__.fit object at ...>, <__main__.fit object at ...>],
# 'project2': [<__main__.fit object at ...>, <__main__.fit object at ...>]}</__main__.fit></__main__.fit></__main__.fit></__main__.fit></__main__.fit>
✅ 关键要点总结:
- 字典值必须是可变容器(如 list),才能支持多次添加;
- 每次插入前需判断键是否存在,避免 KeyError 或误覆盖;
- 若项目规模扩大,可进一步优化为使用 collections.defaultdict(list),但当前继承 dict 的方式更清晰体现控制逻辑;
- 注意 Fit 类中 project_name 属性必须存在且可读,否则 f.project_name 将引发 AttributeError。
此设计兼顾简洁性与可扩展性,是面向对象集合管理的典型实践。











