2017-05-30 4 views
0

Je rencontre un problème sur la façon d'écrire des arguments pour l'initialisation de super classe. Le class App1 doit hériter de deux autres classes. J'ai initialisé tous les arguments des classes de base au class App1, mais l'erreur indique que j'ai trop d'args. Je me demande pourquoi? Fondamentalement, je mets tous les arguments des classes de base dans le super init. Les 3 classes sont écrites en tant que fenêtres multiples, et un Button commande les sauts de classe un par un. Donc, j'appelle le main() comme myApp = Welcome(root, csv_name_ses, csv_name_sub).Arguments d'initialisation de superclasse python

Merci pour votre aide!

class question(object): #first window 
    def __init__(self, algorithmIndex, initX, mid_loss_list = None, mid_gain_list = None): 
      self.initX = initX 
      self.algorithmIndex = algorithmIndex 
      self.mid_gain_list = question.mid_gain_list 
      self.mid_loss_list = question.mid_loss_list 
      ... 

class Welcome(object): #second window 
     def __init__(self, master, csv_name_ses, csv_name_sub): 
      self.master = master 
      Welcome.csv_name_sub = str(self.entrySub.get()) 
      Welcome.csv_name_ses = str(self.entrySes.get()) 
      ... 

class App1(Welcome, question): #third, last one appears 
     def __init__(self, master, csv_name_ses, csv_name_sub, algorithmIndex, initX, mid_loss_list, mid_gain_list): 
      super(App1, self).__init__(master, csv_name_ses, csv_name_sub, algorithmIndex, initX, mid_loss_list, mid_gain_list) 
      ...  

def main(): 

    root = Tk() 
    myApp = Welcome(root, csv_name_ses, csv_name_sub) 
    root.mainloop() 

msg d'erreur:

super(App1, self).__init__(master, csv_name_ses, csv_name_sub, algorithmIndex, initX, mid_loss_list, mid_gain_list) 
TypeError: __init__() takes 4 positional arguments but 8 were given 

Répondre

1

Votre Welcome et question classe ne sont pas écrites comme superclasses coopératives. Si vous souhaitez utiliser super(..), vous devez réécrire leur méthode __init__ pour accepter un nombre quelconque d'arguments, et ils doivent appeler à nouveau super(..).__init__ avec tous les arguments qui ne sont pas encore consommés.

Mais pour votre situation, il est probablement plus facile de simplement appeler explicitement les initialiseurs superclasse:

class Appl(Welcome, question): 
    def __init__(self, master, csv_name_ses, csv_name_sub, algorithmIndex, initX, mid_loss_list, mid_gain_list): 
     Welcome.__init__(self, master, csv_name_ses, csv_name_sub) 
     question.__init__(self, algorithmIndex, initX, mid_loss_list, mid_gain_list) 
1

Vous devez appeler comme ceci:

class App1(Welcome, question): #third, last one appears 
    def __init__(self, master, csv_name_ses, csv_name_sub): 
     Welcome.__init__(master, csv_name_ses, csv_name_sub, algorithmIndex, initX, mid_loss_list, mid_gain_list) 
     question.__init__(algorithmIndex, initX, mid_loss_list, mid_gain_list) 
     ...