2013-04-10 185 views
1

我在文件中有两个类。如何从另一个类中的一个类调用方法

主类将有方法来更新该类中的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' 
+0

这是哪里方法 - EpisodeChange()。我看不到任何定义。 – Avi 2013-04-10 09:15:15

+0

@Avi它的'EpiChange'在问题 – Rao 2013-04-10 09:24:31

回答

6
def EpiChange(self) 

这个签名意味着,你的方法是一个实例方法,实际上等待一个实例对象作为第一个参数。

如果你的方法没有对类实例做任何事情,但需要类本身,它将被称为“类方法”,并应该等待类本身作为第一个参数。最后,如果你的方法既不需要那些(你也不需要在你的方法签名中拥有这些自己的方法),但是你仍然希望它放在某个类中 - 它被称为“静态方法“在Python中。

看看classmethodstaticmethod内置函数(可以使用(并且通常用作装饰器))。

以及您的代码:貌似你添加类需要管理器实例传递给它以某种方式,如:

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) 
+0

我也赞同以同样的方式后拉我的头发。任何如何回答,所以考虑它作为答案。 Thx为答案 – Rao 2013-04-10 10:19:01

5

要调用的函数类而不创建它的一个实例。理论上,您必须创建Manager类的实例,然后调用其方法。喜欢的东西:

manager_object = Manager() 
manager_object.EpicChange() 
+0

中更新在'if __name__ == __main__'中创建'Manager()'的实例如果我在'Add'类中创建'Manager'实例,那么它将进入无限循环。作为经理将创建'添加'实例和'添加'将创建'经理' – Rao 2013-04-10 09:28:13

相关问题