以下是我制作的简单课程。我想访问内部函数,如
obj = TestClass().TestClass(data)
obj.preprocess.gradient()
很明显,这样的调用不起作用,因为preprocess
是一个函数。我怎样才能达到我想要的目标(我希望你能清楚)
编辑:这是一个简化的案例。我希望没有进入机器学习的其他用户更容易以正确的顺序应用正确的功能(首先是预处理,然后是聚类,然后是绘图)。我刚删除了外部函数(预处理等),它工作正常。我仍然想知道这种方法是否合理。
import numpy as np
from sklearn.preprocessing import StandardScaler
class TestClass:
def __init__(self, data):
self.data = data
self._preprocessed = data
# should not be a function but rather a "chapter" which
# separates preprocessing from analysis method
def preprocessing(self):
def gradient(self):
self._preprocessed = np.gradient(self._preprocessed, 2)[1]
def normalize(self):
self._preprocessed = StandardScaler().fit_transform(self._preprocessed)
def cluster_analysis(self):
def pca(self):
pass
答案 0 :(得分:0)
第一种方法(可能比后面的第二种方法更好)是返回拥有这两种方法的类实例,从而有利于组合。
否则,如何返回type
d dict,如下
#...
@property
def preprocessing(self):
def gradient(self):
self._preprocessed = np.gradient(self._preprocessed, 2)[1]
def normalize(self):
self._preprocessed = StandardScaler().fit_transform(self._preprocessed)
callables_dict = {
'gradient':gradient,
'normalize':normalize,
}
return type('submethods', (object,), callables_dict)
#...
然后你可以调用你想要的子方法(我猜),做
>>> TestClass(data).preprocessing.gradient
<unbound method submethods.gradient>
或
>>> TestClass(data).preprocessing.normalize
<unbound method submethods.normalize>
根据您的想法,最好缓存preprocessing
,以便每次调用时都不会重新定义其内部函数。
<小时/> 但正如已经说过的,这可能不是最佳方式。