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