Skip to main content
 首页 » 编程设计

python之如何从一个类调用另一个类的方法

2025年05月04日9haluo1

我在一个文件中有两个类。

主类将具有更新该类中的 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) 

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

如果你的方法不对类实例做任何事情,但需要类本身,它将被称为“类方法”并且应该等待类本身作为第一个参数。

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

看看classmethod和 staticmethod内置函数(可以用作(并且通常用作)装饰器)。

关于您的代码:看起来您的 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)