如何在Python中正确覆盖和调用超级方法

问题描述:

首先,手头有问题。我正在编写一个scikit-learn类的包装,并且遇到了正确的语法问题。我想实现的是fit_transform功能,从而改变输入仅轻微的重写,然后调用它的super - 方法与新的参数:如何在Python中正确覆盖和调用超级方法

from sklearn.feature_extraction.text import TfidfVectorizer 

class TidfVectorizerWrapper(TfidfVectorizer): 
    def __init__(self): 
     TfidfVectorizer.__init__(self) # is this even necessary? 

    def fit_transform(self, x, y=None, **fit_params): 
     x = [content.split('\t')[0] for content in x] # filtering the input 
     return TfidfVectorizer.fit_transform(self, x, y, fit_params) 
          # this is the critical part, my IDE tells me for 
          # fit_params: 'unexpected arguments' 

程序崩溃所有的地方,从一个Multiprocessing exception,没有告诉我任何有用的东西。我如何正确地做到这一点?

附加信息:之所以我需要用这种方式来包装它,是因为我使用sklearn.pipeline.FeatureUnion来收集我的特征提取器,然后将它们放入sklearn.pipeline.Pipeline。这样做的结果是,我只能跨所有特征提取器提供单个数据集 - 但不同的提取器需要不同的数据。我的解决方案是以容易分离的格式提供数据,并在不同的提取器中过滤不同的部分。如果这个问题有更好的解决方案,我也很乐意听到。

编辑1: 添加**解压字典似乎没有改变什么: Screenshot

编辑2: 我刚刚解决剩下的问题 - 我需要删除构造函数重载。显然,通过试图调用父构造函数,希望让所有实例变量都能正确启动,我的确做了相反的事情。我的包装不知道它可以预期什么样的参数。一旦我删除了多余的电话,一切都完美了。

+1

你尝试更换'返回TfidfVectorizer.fit_transform(个体经营,X,Y,fit_params)'和'返回TfidfVectorizer.fit_transform (self,x,y,** fit_params)'? – user3012759

+0

也取决于'y'在方法签名中的位置,可能需要“命名”'y':'返回TfidfVectorizer.fit_transform(self,x,y = y,** fit_params)' –

+0

@KlausD。同意,但fit_params几乎肯定不是正确的东西传入,因为它是一个字典 – user3012759

忘记解压缩fit_params这是作为dict传递,你想通过它作为keyword arguments需要解包运算符**

from sklearn.feature_extraction.text import TfidfVectorizer 

class TidfVectorizerWrapper(TfidfVectorizer): 

    def fit_transform(self, x, y=None, **fit_params): 
     x = [content.split('\t')[0] for content in x] # filtering the input 
     return TfidfVectorizer.fit_transform(self, x, y, **fit_params) 

是instaed调用TfidfVectorizerfit_transform直接就可以通过super方法调用重载版本的一件事

from sklearn.feature_extraction.text import TfidfVectorizer 

class TidfVectorizerWrapper(TfidfVectorizer): 

    def fit_transform(self, x, y=None, **fit_params): 
     x = [content.split('\t')[0] for content in x] # filtering the input 
     return super(TidfVectorizerWrapper, self).fit_transform(x, y, **fit_params) 

要理解它检查下面的例子

def foo1(**kargs): 
    print kargs 

def foo2(**kargs): 
    foo1(**kargs) 
    print 'foo2' 

def foo3(**kargs): 
    foo1(kargs) 
    print 'foo3' 

foo1(a=1, b=2) 

它打印字典{'a': 1, 'b': 2}

foo2(a=1, b=2) 

版画既字典和foo2,但

foo3(a=1, b=2) 

引发错误,因为我们发送的位置参数等于我们的字典foo1,不接受这样的事情。然而,我们可以做

def foo4(**kargs): 
    foo1(x=kargs) 
    print 'foo4' 

,工作正常,但打印新的字典{'x': {'a': 1, 'b': 2}}

+0

可能值得添加一个或两个关于'超()'回答其他问题OP有 – user3012759

+0

我尝试了你的建议,我仍然收到完全相同的错误。我在主帖中也添加了一条评论。 – Arne

+0

我确实删除了构造函数,也许它应该更加强调下划线 – lejlot