Python 如何从超类方法调用子类的方法?

Python 如何从超类方法调用子类的方法?,python,class,inheritance,Python,Class,Inheritance,假设我有这个班: 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

假设我有这个班:

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是代码的主要类,其中包含所有小部件和主要函数。 这个类上还有一个按钮,它绑定了“test”函数。因此,当按下按钮时,整个过程都应该工作。 MySubClass文件是将数据导出到某个文件的辅助模块。 firstFunc是此模块中处理所有数据的主函数,而secondFunc只构建文件的模板。因此,我在firstFunc中调用secondFunc,以便加载模板,然后将数据写入文件中。 我从MyClass继承了这个MySubClass,这样它就可以直接从MyClass访问数据库和其他变量

所以我想我可以用另一种方式。但我对这种实现并没有真正的经验。还有,很抱歉我的英语不好。

改变:

d = self.secondFunc(self, c)
致:


您试图调用
firstFunc
,就好像它是一个静态方法,而它是一个实例方法。您可以使用
classmethod
decorator来实现静态方法效果

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

请注意,将
test
作为
MyClass
的一种方法是没有意义的,因为您无论如何都不能从那里使用它。您不妨将
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())

但我强烈建议您重新构造代码。

仍然会出现此错误:“AttributeError:'MyClass'对象没有属性'secondFunc'”,我会在
secondFunc()
上放置和
@classmethod
,但它仍然会引发此错误。这是你的意思还是我做错了?“这是一个愚蠢的例子,但恰恰代表了我要做的事情”但是为什么你想从超类方法中的子类调用方法?这毫无意义……你为什么要这么做?正如你所描述的,你真的不应该这样做。真的不应该。请描述你想要实现的目标。几乎可以肯定有一个正确的方法来实现它。我刚刚编辑了这个问题,以便我的目标变得更加明确。谢谢你,谢谢你的帮助。但是,我真的需要在MyClass中调用该函数。难道我没有办法让这一切顺利吗?我想不出什么办法。为什么需要在MyClass中调用该函数?您可以将firstFunc和secondFunc更改为正则函数——然后您可以将这些函数绑定为MySubClass上的正则方法。。。(我会更新)非常感谢@mgilson。我按照你说的方式重新构造了代码,现在它可以工作了。我知道这些函数现在不是继承的,它们是直接从子类调用的。但我承认我对这一切有点困惑,我还需要进一步研究。
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.
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())