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

2024-06-28 10:59:31 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样的课程:

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()

其他文件中的子类:

^{pr2}$

这是一个愚蠢的例子,但恰恰代表了我所要做的。 我想从第一个函数内部的子类调用第二个函数。 但当我这样做时,它会返回一个错误,说明MyClass没有这个函数。 所以我想我不应该在调用函数名之前使用self。但当我不这样做的时候,它也会引起一个错误。在

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

编辑:

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

所以我想我可以换一种方式。但我对这种实现方式并不是很有经验。还有,对不起我的英语不好。在


Tags: 模块文件数据函数代码testselfdef
3条回答

更改:

d = self.secondFunc(self, c)

收件人:

^{pr2}$

firstFunc是实例方法时,您试图将其当作静态方法调用。您可以使用classmethod修饰符来实现静态方法效果。在

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

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两次。在

这是有效的:

^{pr2}$

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

相关问题 更多 >