如何从另一个类中的一个类调用方法
我在文件中有两个类。如何从另一个类中的一个类调用方法
主类将有方法来更新该类中的UI元素。它创建另一个类的实例。
我想从另一个实例化的类中更新主类中的UI。
class Add(QtGui.QMainWindow,Ui_AddShotDetails):
def __init__(self):
super(Add,self).__init__()
self.setupUi(self)
def addDetails(self):
#Do some stuff and call method in Manager class
Manager.EpiChange() # I get the error at this line
class Manager(QtGui.QMainWindow,Ui_ShotManager):
def __init__(self):
super(Manager,self).__init__()
self.setupUi(self)
self.AddWindow = Add()
def EpiChange(self):
Manager.EpiCode = str(self.cmb_Epi.currentText())
# Update ui elements
def addShot(self):
self.AddWindow.show()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
win = Manager()
win.show()
sys.exit(app.exec_())
我得到以下回溯
Traceback (most recent call last):
File "D:\Manager.py", line 18, in addDetails
Manager.EpiChange()
TypeError: unbound method EpiChange() must be called with Manager instance as first argument (got nothing instead)
我试图使这种方法使用@classmethod
类方法,如果我用这个,我得到下面回溯
Traceback (most recent call last):
File "D:\Manager.py", line 27, in EpiChange
Manager.EpiCode = str(self.cmb_Epi.currentText())
AttributeError: type object 'Manager' has no attribute 'cmb_Epi'
def EpiChange(self)
这个签名意味着,你的方法是一个实例方法,实际上等待一个实例对象作为第一个参数。
如果你的方法没有对类实例做任何事情,但需要类本身,它将被称为“类方法”,并应该等待类本身作为第一个参数。最后,如果你的方法既不需要那些(你也不需要在你的方法签名中拥有这些自己的方法),但是你仍然希望它放在某个类中 - 它被称为“静态方法“在Python中。
看看classmethod和staticmethod内置函数(可以使用(并且通常用作装饰器))。
以及您的代码:貌似你添加类需要管理器实例传递给它以某种方式,如:
class Add(QtGui.QMainWindow,Ui_AddShotDetails):
def __init__(self, manager):
super(Add,self).__init__()
self.manager = manager
self.setupUi(self)
def addDetails(self):
#Do some stuff and call method in Manager class
self.manager.EpiChange() # I get the error at this line
,然后创建添加例如这样说:
self.AddWindow = Add(self)
我也赞同以同样的方式后拉我的头发。任何如何回答,所以考虑它作为答案。 Thx为答案 – Rao 2013-04-10 10:19:01
要调用的函数类而不创建它的一个实例。理论上,您必须创建Manager
类的实例,然后调用其方法。喜欢的东西:
manager_object = Manager()
manager_object.EpicChange()
中更新在'if __name__ == __main__'中创建'Manager()'的实例如果我在'Add'类中创建'Manager'实例,那么它将进入无限循环。作为经理将创建'添加'实例和'添加'将创建'经理' – Rao 2013-04-10 09:28:13
这是哪里方法 - EpisodeChange()。我看不到任何定义。 – Avi 2013-04-10 09:15:15
@Avi它的'EpiChange'在问题 – Rao 2013-04-10 09:24:31