2012-06-18 127 views
3

假设我有这个类:如何从超类方法调用子类的方法?

class MyClass(object): 
    def uiFunc(self, MainWindow): 
     self.attr1 = "foo" 
     self.attr2 = "bar" 
    def test(): 
     from subclassfile import MySubClass 
     MySubClass.firstFunc(self, 2, 2) 

    test() 

而这个子类中的其他文件:

from classfile import MyClass 

class MySubclass(MyClass): 
    def firstFunc(self, a, b): 
     c = a + b 
     d = self.secondFunc(self, c) 
     return d 

    def secondFunc(self, c): 
     d = c/2 
     return d 

这是一个愚蠢的例子,但代表正是我试图做的。 我想从第一个函数内的子类中调用第二个函数。 但是,当我这样做时,它返回一个错误,说MyClass没有这样的功能。 所以我想我不应该在函数名称前面使用self。但是当我不这样做时,它也会产生错误。

所以我的问题是: 如何在子类的第一个函数内部访问第二个函数?

编辑:

谢谢大家的帮助。我会更好地解释我正在尝试做什么,而我认为我的实现在代码中非常糟糕。 MyClass是代码的主要类,其中所有的部件和主要功能都是。 此类上还有一个按钮,它与“测试”功能绑定在一起。所以当按下按钮时,整个事情都应该起作用。 MySubClass文件是将数据导出到某个文件的辅助模块。 firstFunc是这个模块中的主要功能,它处理所有的数据,而secondFunc只是建立文件的模板。所以我在firstFunc中调用了这个secondFunc,以便模板被加载,然后将数据写入文件。 我使这个MySubClass继承自MyClass,以便它可以直接从MyClass访问数据库和其他变量。

所以我想我可以做到这一点。但我对这种实现并不是很有经验。另外,对不起我的英语不好。

+2

“这是一个愚蠢的例子,但代表了我正在尝试做的事情”。但是,为什么要在超类方法中调用子类中的方法?这是毫无意义的...... – brandizzi

+0

*为什么*你想这样做?正如你所描述的那样,你真的不应该这样做。真的*真的*不应该。请描述你想要达到的目标。几乎肯定有一个正确的方法来实现它。 –

+0

我刚刚编辑了这个问题,以便我的目标变得更加清晰。谢谢。 –

回答

2

您不会从MyClass的实例调用此方法,您可以从MySubclass的实例调用此方法。问题是你可能得到一个TypeError,因为你传递给firstFunc的参数(self)是错误的类型(MyClass而不是MySubClass)。解决方案是重构你的代码,所以这不会发生。至少,我认为这是问题(当我尝试你的代码时,我得到各种导入错误)。下面是我试过的代码(我假设说明了您所描述的问题):

class MyClass(object): 
    def uiFunc(self, MainWindow): 
     self.attr1 = "foo" 
     self.attr2 = "bar" 
    def test(self): 
     return MySubClass.firstFunc(self, 2, 2) 

class MySubClass(MyClass): 
    def firstFunc(self, a, b): 
     c = a + b 
     d = self.secondFunc(c) #removed self from parameter list 
     return d 

    def secondFunc(self, c): 
     d = c/2 
     return d 


a=MyClass() 
b=MySubClass() 
print (b.test()) #this works because b is the right type to pass to first/second func 
a.test() #This doesn't work because a is the wrong type. 

注意,它并没有真正意义的具有testMyClass的方法,因为你不能无论如何,从那里使用它。您可能只需将test移动到MySubClass

另外,正如其他人所指出的,self.secondfunc(self,c)也很奇怪。这基本上相当于MySubClass.secondfunc(self,self,c),它有错误的参数数量,因为你传递了两次self

这工作:

class MyClass(object): 
    def uiFunc(self, MainWindow): 
     self.attr1 = "foo" 
     self.attr2 = "bar" 
    def test(self): 
     return firstFunc(self, 2, 2) 


def firstFunc(self, a, b): 
    c = a + b 
    d = secondFunc(self,c) #self from in front of function, now in parameter list 
    return d 

def secondFunc(self, c): 
    d = c/2 
    return d 

class MySubClass(MyClass): 
    firstFunc=firstFunc 
    secondFunc=secondFunc 


a=MyClass() 
b=MySubClass() 
print (b.test()) 
print (a.test()) 

但我强烈建议重组你的代码。

+0

谢谢你的帮助。但是,我真的需要在MyClass中调用该函数。无论如何,我无法做到这一点? –

+0

没办法,我能想到。为什么你需要在MyClass中调用该函数?您可以将firstFunc和secondFunc更改为常规函数 - 然后您可以将这些函数作为MySubClass上的常规方法绑定......(我将更新) – mgilson

+0

@ dex19dt - 我已更新。上面的代码有效。 – mgilson

2

变化:

d = self.secondFunc(self, c) 

要:

d = self.secondFunc(c) 
+0

仍然有这个错误:“AttributeError:'MyClass'对象没有属性'secondFunc'” –

1

你想打电话firstFunc,好像它是当它是一个实例方法静态方法。您可以使用装饰器classmethod来实现静态方法效果。

+0

我把'@ classmethod'放在'secondFunc()'上,但它仍然会引发这个错误。这是你的意思,还是我做错了? –