繁体   English   中英

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

[英]How do I call a method of a subclass from a superclass method?

假设我有这个课程:

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访问数据库和其他变量。

所以我想我可以做到这一点。 但我对这种实现并不十分熟悉。 还有,抱歉我的英语不好。

更改:

d = self.secondFunc(self, c)

至:

d = self.secondFunc(c)

您不从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.

请注意,将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())

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

你试图调用firstFunc ,就好像它是一个静态方法,当它是一个实例方法时。 您可以使用classmethod装饰器来实现静态方法效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM