类方法结果存储最佳实践:存为类变量还是返回后供其他方法调用?
类方法设计疑问:保存结果为类变量还是返回结果作为参数?
本人未接受过系统编程训练,编写类并按顺序调用其方法时,常纠结一个问题:是将方法执行结果保存为类变量,还是返回结果并作为后续方法的输入参数?以下是两种实现示例:
方式一:返回结果作为后续方法输入
class ProcessData: def __init__(self): pass def get_data(self, path): data = pd.read_csv(f"{path}/data.csv") return data def clean_data(self, data): data.set_index("timestamp", inplace=True) data.drop_duplicates(inplace=True) return data def main(): processor = ProcessData() temp = processor.get_data("path/to/data") processed_data = processor.clean_data(temp)
方式二:将结果保存为类变量
class ProcessData: def __init__(self): self.data = None def get_data(self, path): data = pd.read_csv(f"{path}/data.csv") self.data = data def clean_data(self): self.data.set_index("timestamp", inplace=True) self.data.drop_duplicates(inplace=True) def main(): processor = ProcessData() processor.get_data("path/to/data") processor.clean_data()
我猜测第二种方式更优,但也认为第一种有适用场景,想了解一般情况下的最佳实践准则。
最佳实践准则
两种方式没有绝对优劣,核心取决于类的职责定位和使用场景,以下是具体判断标准:
优先选择类变量的场景
- 类是状态化的流程容器:如果
ProcessData的核心是围绕某一份数据完成全流程处理(获取→清洗→转换→导出),生命周期内只处理单份数据,用类变量保存数据能让调用逻辑更简洁,避免外部反复传递数据。 - 多方法需共享中间状态:如果后续还有
feature_engineer、export_data等方法依赖这份数据,类变量可减少参数传递冗余,让代码结构更清晰。 - 支持链式调用:可将方法改为返回
self,实现processor.get_data(path).clean_data().feature_engineer()的写法,提升代码可读性。
优先选择返回结果的场景
- 类是无状态工具类:如果
ProcessData仅提供数据处理工具方法,无需维护持久状态,同一个实例可同时处理多份不同数据,返回结果的方式更灵活:processor = ProcessData() data1 = processor.get_data("path1") cleaned1 = processor.clean_data(data1) data2 = processor.get_data("path2") cleaned2 = processor.clean_data(data2) - 方法需保持纯函数特性:如果
clean_data仅根据输入返回输出,不依赖类其他状态,这样的方法更易单独测试、复用,也符合函数式编程思想。 - 避免隐式状态依赖:类变量的状态变化无明确标识,后续维护时可能混淆
self.data是原始数据还是清洗后的数据;返回结果的方式让数据流向更清晰,每一步结果由外部变量明确持有。
折中方案
若想兼顾状态维护与灵活性,可提供双接口:类内部用类变量维护状态,同时让方法支持传入数据并返回结果;或添加reset_data方法清空状态,方便复用实例处理多份数据。
内容的提问来源于stack exchange,提问作者Fruity Fritz
相关产品推荐
相关产品推荐

