单个对象与多个对象:哪种是更优的OOP设计方案?
问题分析与解决方案
首先要指出你原代码里的关键问题:store是类属性,所有Data实例会共享这个字典。不管创建多少个实例,调用add_to_store操作的都是同一个store['key']列表,这会导致数据混乱,必须先修正——把store改成实例属性,让每个实例拥有独立的存储:
class Data: def __init__(self): self.arg1 = 'value' self.arg2 = 'value' self.store = {'key': []} # 改为实例属性,每个对象独立拥有 def add_to_store(self, contents): # 必须添加self参数,否则无法访问实例属性 self.store['key'] += contents
接下来针对你的两种写法,分场景说明:
场景1:每个文件对应独立的Data对象
如果需要为每个文件内容创建独立的Data实例,后续要分别处理每个文件的数据,就用循环创建新对象的写法:
data_instances = [] for file_content in files_contents: d = Data() d.add_to_store(file_content) data_instances.append(d)
这种方式每个d的store只保存对应文件的内容,彼此独立,适合单独操作单文件数据的场景。
场景2:汇总所有文件内容到同一个对象
如果需要把所有文件的内容合并到同一个Data实例的store里,就复用一个对象:
d = Data() for file_content in files_contents: d.add_to_store(file_content)
此时d.store['key']会包含所有文件的内容,适合批量处理全部数据的场景。
如果需要分批处理(比如处理完一批文件后清空存储再处理下一批),可以给Data类加一个清空方法:
class Data: def __init__(self): self.arg1 = 'value' self.arg2 = 'value' self.store = {'key': []} def add_to_store(self, contents): self.store['key'] += contents def clear_store(self): self.store['key'] = [] # 清空存储列表
使用方式:
d = Data() for batch in batches_of_files: d.clear_store() for file_content in batch: d.add_to_store(file_content) # 处理当前批次的数据
总结
两种写法没有绝对优劣,完全取决于业务需求:
- 需要独立存储单文件数据 → 每次创建新对象
- 需要汇总所有数据 → 复用一个对象
- 需要分批汇总 → 复用对象+清空方法
内容的提问来源于stack exchange,提问作者suziex
相关产品推荐
相关产品推荐

