如何在自定义Python类中存储方法运行结果?类比sklearn Estimator
如何在自定义Python类中实现类似sklearn Estimator的结果存储机制?
在sklearn中,调用LinearRegression这类Estimator实例的fit方法时,训练结果会直接存储在该实例内部,后续无需创建新对象就能调用predict等方法使用这些结果。那要怎么在自定义Python类里实现类似机制,把run_model方法的运行结果存储在类实例中?
sklearn示例代码:
lr = LinearRegression() lr.fit(X_train, y_train)
你提供的自定义类代码:
import pandas as pd data = pd.DataFrame({'n':[1,1,4,1], 'target':[36,8,0,41], 'string':['z', 's', 'd', 'h']}) class test: def __init__(self, dataframe, target, features): self.dataframe=dataframe self.target = target self.features = features def x_y(self): X=self.dataframe[self.features] y=self.dataframe[[self.target]] return X, y def run_model(self): X, y = self.x_y() list_result = X.n*4 return list_result a = test(dataframe=data, target='target', features=['n','string']) a.run_model()
输出:
0 4 1 4 2 16 3 4 Name: n, dtype: int64
实现方法
核心逻辑是在方法内部将计算结果赋值给实例的属性(用self.属性名的形式存储),和sklearn把训练参数存在self.coef_、self.intercept_这类实例属性的思路一致。
修改后的完整代码
import pandas as pd data = pd.DataFrame({'n':[1,1,4,1], 'target':[36,8,0,41], 'string':['z', 's', 'd', 'h']}) class test: def __init__(self, dataframe, target, features): self.dataframe=dataframe self.target = target self.features = features # 提前初始化结果属性,让类结构更清晰 self.result_ = None def x_y(self): X=self.dataframe[self.features] y=self.dataframe[[self.target]] return X, y def run_model(self): X, y = self.x_y() list_result = X.n*4 # 将结果绑定到实例属性中 self.result_ = list_result # 保留返回结果,不破坏原有调用习惯 return list_result a = test(dataframe=data, target='target', features=['n','string']) a.run_model() # 直接通过实例属性获取结果,无需重复执行计算 print(a.result_)
关键说明
- 提前初始化属性:在
__init__方法里声明self.result_ = None,既明确类的结构,也能避免后续未调用run_model就访问结果时出现属性未定义的报错。 - 存储结果到实例:在
run_model中计算出结果后,用self.result_ = list_result把结果绑定到实例上,这里用下划线结尾命名是遵循sklearn的惯例(标识该属性是拟合/计算后生成的)。 - 复用结果:后续直接通过
a.result_就能获取结果,不需要重复调用run_model执行计算,节省资源。
扩展:类似predict的方法
如果需要像sklearn那样封装结果获取逻辑,可以新增一个方法:
def get_result(self): if self.result_ is None: raise ValueError("请先调用run_model方法生成结果") return self.result_
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

