当函数返回self时,我可以访问变量吗?

时间:2014-09-14 04:47:16

标签: python

函数“pipeline.py”中的一段代码如下

def fit(self, X, y=None, **fit_params):
    """Fit all the transforms one after the other and transform the
    data, then fit the transformed data using the final estimator.
    """
    Xt, fit_params = self._pre_transform(X, y, **fit_params)
    self.steps[-1][-1].fit(Xt, y, **fit_params)
    return self

在main()中调用:

pl.fit(X_train, y_train)

我对自我的使用并不熟悉。我的问题是,我可以在不改变“适合”功能的情况下访问变量“Xt”吗?

1 个答案:

答案 0 :(得分:2)

是的,在这个特定的例子中 - 看起来你可以这样做:

Xt, fit_params = pl._pre_transform(X_train, y_train)

...在fit函数之外获取Xt,然后忽略fit_params

值得庆幸的是,看起来fit函数计算Xt的方式非常简单 - 只需对方法进行一次调用即可。但请注意,_pre_transform被标记为“私有”方法 - 通过使用下划线启动方法,您正在使用的库的作者已表明该方法名义上是私有的,不属于公共API,可能会在以后的版本中更改。

看起来该方法也在修改自己,所以你应该仔细检查以确保调用_pre_transform不会造成任何副作用。


我怎么知道这会起作用?

好吧,当你做pl.fit(X_train, y_train)时,我知道Python会在内部重写这样的内容:

fit(pl, X_train, y_train)

这意味着在fit方法中,self引用plX引用X_trainy引用{ {1}}。

通常,当您执行y_train时,它与my_obj.method(a, b)大致相同。这意味着method(my_obj, a, b)通常与self相同(除非你做的事情非常奇怪/做元编程)。

然后,my_obj方法的第一行是:

fit

所以,如果Xt, fit_params = self._pre_transform(X, y, **fit_params) self -> plX -> X_train,我知道这行代码实际上在做:

y -> y_train

我也知道你可以忽略Xt, fit_params = pl._pre_transform(X_train, y_train, **fit_params) ,因为除了X_train和y_train之外你没有提供任何参数:

fit_params

好吧,没有什么可以阻止我们在Xt, fit_params = pl._pre_transform(X_train, y_train) 函数之外调用这段确切的代码 - 无论它在何处被调用,它都应该正常运行。所以我做到了。


然而,更一般的问题的答案是'不' - 仅仅因为函数使用'self'并不意味着函数内的变量是自动可用的。该方法必须返回fit,或执行Xt之类的操作,将self.Xt = Xt添加为对象的字段。