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'
4

2 回答 2

6
def EpiChange(self)

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

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

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

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

关于您的代码:看起来您的 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)
于 2013-04-10T09:47:31.580 回答
5

您正在调用一个类的函数而不创建它的实例。理论上,你必须创建一个Manager类的实例,然后调用它的方法。就像是:

manager_object = Manager()
manager_object.EpicChange()
于 2013-04-10T09:21:48.397 回答