1

ファイルに 2 つのクラスがあります。

メイン クラスには、そのクラスの 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)

このシグネチャは、メソッドがインスタンス メソッドであり、実際にはインスタンス オブジェクトを最初の引数として待機していることを意味します。

メソッドがクラス インスタンスに対して何もせず、クラス自体を必要とする場合、それは「クラス メソッド」と呼ばれ、最初の引数としてクラス自体を待機する必要があります。

そして最後に、メソッドがそれらのどちらも必要としない場合 (そして、メソッド シグネチャにこれらの自己を含める必要がない場合)、それでも何らかのクラスに配置したい場合は、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)
于 2013-04-10T09:47:31.580 に答える
5

クラスのインスタンスを作成せずにクラスの関数を呼び出しています。理論的には、Managerクラスのインスタンスを作成してから、そのメソッドを呼び出す必要があります。何かのようなもの:

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