Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python类:内部函数;通过嵌套点访问_Python - Fatal编程技术网

python类:内部函数;通过嵌套点访问

python类:内部函数;通过嵌套点访问,python,Python,下面是我制作的一个简单的类。我想访问像这样的内部函数 obj = TestClass().TestClass(data) obj.preprocess.gradient() 很明显,这样的调用不起作用,因为预处理是一个函数。我怎样才能达到我想要的我希望你明白 编辑:这是一个简化的案例。我希望其他不喜欢机器学习的用户会发现,以正确的顺序应用适当的功能更容易,首先是预处理,然后是聚类,然后是绘图。我刚刚删除了外部函数预处理等。它的工作很好。不过,我不知道这种做法是否合理 import numpy

下面是我制作的一个简单的类。我想访问像这样的内部函数

obj = TestClass().TestClass(data)
obj.preprocess.gradient()

很明显,这样的调用不起作用,因为预处理是一个函数。我怎样才能达到我想要的我希望你明白

编辑:这是一个简化的案例。我希望其他不喜欢机器学习的用户会发现,以正确的顺序应用适当的功能更容易,首先是预处理,然后是聚类,然后是绘图。我刚刚删除了外部函数预处理等。它的工作很好。不过,我不知道这种做法是否合理

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

第一种方法可能比下面的第二种方法更好,即返回一个拥有这两种方法的类实例,从而有利于组合

否则,返回键入的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>

根据您想要执行的操作,最好缓存预处理,这样就不会在每次调用它时重新定义其内部函数


但正如前面所说的,这可能不是最好的方法。

我想你是指obj=TestClassdata?另外,预处理方法是从哪里来的,你不是指预处理吗?此外,我认为制定一个问题会对我们有所帮助。这是你试图解决的问题的代表,还是只是简化了?因为如果这个方法只是为了定义其他函数而存在,那么有更好的方法来实现这一点。梯度不是预处理返回值的属性;它只是预处理范围内的局部变量。预处理需要返回具有渐变属性的内容。或者,预处理需要是一个简单的实例属性,而不是一个实例方法。很明显,这样的调用不起作用,因为预处理是一个函数。很不对。函数是Python中的第一类对象,通常定义了与之类似的属性。有关一个流行的示例,请参见numpy funcs。表示法失败的原因是,与父名称空间中的任何其他瞬态对象相比,内部函数不是父名称空间的属性。对我的答案不满意吗?它按你的要求做。也许有一些精确性?为什么在属性方法中笨拙地构建一个类型,而您可以使用class语句来代替呢?将@property def preprocessing替换为class preprocessing`并去掉callables_dict和return语句,您就得到了一些等价的东西,但比您所展示的要好。不知道这是否真的是发问者想要的…@Blckknght。同等或更好?其实我这样做是因为。话虽如此,我也不是100%确定OP想要什么:。我认为用class语句构建类几乎总是比在字典中抛出方法并在运行时手动调用type来构建类要好。其中一个原因是,您的版本将创建一组单独的类。它们将具有相同的内容,但它们不会是同一个类,如果您尝试类似isinstancex.preprocessing、x.preprocessing的操作,这可能会非常混乱。但我想我们可能同意提问者的设计不是很好,完全避免内部阶级会更好。
>>> TestClass(data).preprocessing.normalize
<unbound method submethods.normalize>