python - 如何从父类(super class)方法调用子类的方法?

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

所以我想我可以用其他方式做到这一点。但是我对这种实现并没有真正的经验。另外,抱歉我的英语不好。

最佳答案

您不是从 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())

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

关于python - 如何从父类(super class)方法调用子类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11083007/

相关文章:

python - 在pyqt中模拟鼠标移动

c++ - Microsoft Visual C++ 2010 Express - 正确代码中的错误

c++ - 类成员和函数c++

python - 更新字典对象中的值

python - 正确的 xpath 来卷起子项的文本

Python 如何扩展 `str` 并重载其构造函数?

c++ - C++ 派生类中的 this 值

entity-framework - 如何使用 Entity Framework 4 继承来确定实体的子类型?

c++ - 空基类构建开销?

python - sklearn中KMeans的变换是否可以逆转?