Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从一个类调用另一个类中的方法_Python_Oop_Class_Pyqt4 - Fatal编程技术网

Python 如何从一个类调用另一个类中的方法

Python 如何从一个类调用另一个类中的方法,python,oop,class,pyqt4,Python,Oop,Class,Pyqt4,我在一个文件中有两个类 Main类将具有更新该类中UI元素的方法。它创建另一个类的实例 我想从另一个实例化的类更新main类中的UI class Add(QtGui.QMainWindow,Ui_AddShotDetails): def __init__(self): super(Add,self).__init__() self.setupUi(self) def addDetails(self): #Do some st

我在一个文件中有两个类

Main类将具有更新该类中UI元素的方法。它创建另一个类的实例

我想从另一个实例化的类更新main类中的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
将此方法作为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'

您正在调用一个类的函数,而没有创建它的实例。理论上,您必须创建
Manager
类的实例,然后调用其方法。比如:

manager_object = Manager()
manager_object.EpicChange()

您正在调用一个类的函数,而没有创建它的实例。理论上,您必须创建
Manager
类的实例,然后调用其方法。比如:

manager_object = Manager()
manager_object.EpicChange()
这个签名意味着,您的方法是一个实例方法,并实际等待一个实例对象作为第一个参数

如果您的方法不处理类实例,但需要类本身,那么它将被称为“类方法”,并应等待类本身作为第一个参数

最后,如果您的方法不需要这两个(并且您的方法签名中不需要这些self),但您仍然希望将其放置在某个类中—在Python中称为“静态方法”

查看和内置函数(可以用作(通常用作)装饰器)

关于您的代码:看起来您的Add类需要以某种方式将Manager实例传递给它,例如:

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)
这个签名意味着,您的方法是一个实例方法,并实际等待一个实例对象作为第一个参数

如果您的方法不处理类实例,但需要类本身,那么它将被称为“类方法”,并应等待类本身作为第一个参数

最后,如果您的方法不需要这两个(并且您的方法签名中不需要这些self),但您仍然希望将其放置在某个类中—在Python中称为“静态方法”

查看和内置函数(可以用作(通常用作)装饰器)

关于您的代码:看起来您的Add类需要以某种方式将Manager实例传递给它,例如:

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)

这个方法在哪里-epiodechange()。我看不到它的任何定义。@Avi-its
EpiChange
在问题中更新了此方法的位置-epiodechange()。我看不到它的任何定义。@Avi它的
EpiChange
在问题中更新
Manager()
的实例是在
中创建的,如果
添加
类中创建
Manager
实例,它将进入无限循环。因为管理者将创建
Add
实例,而
Add
将创建
Manager()的
instance
实例,如果
中创建
Manager()
,那么它将进入无限循环。因为经理将创建
Add
实例,而
Add
将创建
Manager
我也以同样的方式拉扯头发。不管你怎么回答,所以把它当作答案。对于回答,我也用同样的方式拉扯我的头发。不管你怎么回答,所以把它当作答案。谢谢你的回答