2016-12-23 3 views
0

Ich habe 2 Klassen, die ich beide von einer anderen Klasse erben soll. Diese 2 Klassen haben bereits , definiert. Nun möchte ich, dass diese 2 Klassen eine Methode erben, die eine Reihe von Parametern (Argumenten) benötigt. Aber in den 2 Klassen, die erben sollten, wird die überschrieben.Vererbung: __init__ überschrieben

Wie kann ich dieses Problem lösen? Ich lese über Konstruktoren in Python vs . Könnte ich vielleicht einen benutzerdefinierten Konstruktor für die Methode erstellen? Ich bin ziemlich neu im Unterricht.

EDIT:

Hier ist, was ich attemping. Dies ist ein GUI-Projekt. Dies ist die Hauptklasse:

class Error: 
    def __init__(self, check0, check1, check2, check3, check4, check5, check6, check7, check8, check9, check10, check11, 
        check12, check13, check14, check15): 
     self.check0 = check0 
     self.check1 = check1 
     self.check2 = check2 
     self.check3 = check3 
     self.check4 = check4 
     self.check5 = check5 
     self.check6 = check6 
     self.check7 = check7 
     self.check8 = check8 
     self.check9 = check9 
     self.check10 = check10 
     self.check11 = check11 
     self.check12 = check12 
     self.check13 = check13 
     self.check14 = check14 
     self.check15 = check15 

    def feedbackOnError(self): 
     feedback = '' 
     global feedback 

     if self.check0 == False: 
      feedback0 = "You didn't provide a name and/or mail" 
      feedback = feedback0 

     if self.check3 == False: 
      feedback3 = "You didn't provide a valid year (you used over 4 digits or none)" 
      feedback = feedback3 

     if self.check4 == False: 
      feedback4 = "You didn't provide a valid year (you used letters)" 
      feedback = feedback4 

     if self.check5 == False: 
      feedback5 = "You didn't provide a valid month (you used over 2 digits or none)" 
      feedback = feedback5 

     if self.check6 == False: 
      feedback6 = "You didn't provide a valid month (you used letters)" 
      feedback = feedback6 

     if self.check7 == False: 
      feedback7 = "You didn't provide a valid month (you used a number above 12)" 
      feedback = feedback7 

     if self.check8 == False: 
      feedback8 = "You didn't provide a valid month '00' is not a month)" 
      feedback = feedback8 

     if self.check9 == False: 
      feedback9 = "You didn't provide a valid day (you used letters)" 
      feedback = feedback9 

     if self.check10 == False: 
      feedback10 = "You didn't provide a valid day '00' is not a day)" 
      feedback = feedback10 

     if self.check11 == False: 
      feedback11 = "You didn't provide a valid day (you used a number above 31)" 
      feedback = feedback11 

     if self.check12 == False: 
      feedback12 = "You didn't provide a valid day (you used over 2 digits or none)" 
      feedback = feedback12 

     if self.check13 == False: 
      feedback13 = "Your month doesn't match up with your day (February has 29 during leap year)" 
      feedback = feedback13 

     if self.check14 == False: 
      feedback14 = "Your month doesn't match up with your day (February has 28 during normal years)" 
      feedback = feedback14 

     if self.check15 == False: 
      feedback15 = "Your chosen month and day don't match up (You used '31' for a month with only 30)" 
      feedback = feedback15 

     if self.check1 == False: 
      feedback1 = "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :" 
      feedback = feedback1 

     if self.check2 == False: 
      feedback2 = "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :" 
      feedback = feedback2 

Dies ist die Klassen I die Hauptklasse erben wollen:

class AddDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     super(AddDialog, self).__init__(*args, **kwargs) 


class EditDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     super(EditDialog, self).__init__(*args, **kwargs) 
+3

Sie müssen uns Ihren Code zeigen, wenn wir darauf hinweisen, was Sie falsch gemacht haben. – user2357112

+0

Versuchen Sie, 'Super' in Ihren' __init__' Methoden aufzurufen. – bjd2385

+1

Es ist unklar, wie '__init__' mit Ihrem Problem" erben einer Methode "zusammenhängt ... oder dass das Problem besteht. –

Antwort

0

Das Problem, dass Sie nur zu sein scheint, sind eine der beiden Basisklasse Ausführung __init__ Methoden, die Sie haben, aber Sie möchten Argumente übergeben und beide aufrufen.

super wird nur die Methode angezeigt, die zuerst in der Methodenauflösungsreihenfolge (MRO) angezeigt wird. Sie müssen also mindestens eines der __init__ s "manuell" aufrufen. Sie müssen auch entscheiden, welche Argumente zu dem abgeleiteten __init__ wo gehen, da Sie beide Sätze von Argumenten übergeben müssen. Aus Gründen der diesem Beispiel werde ich, dass Fehler vortäuschen dauert nur drei erforderlichen Positionsargumente (check0, check1 und check2):

class AddDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, check0, check1, check2, *args, **kwargs): 
     Error.__init__(self, check0, check1, check2) 
     SizedDialog.__init__(self, *args, **kwargs) 

Über einen entsprechenden Hinweis, ich würde empfehlen, dass Sie Ihren Code Refactoring, eine Liste zu verwenden denn ehrlich gesagt sind 16 Argumente lächerlich. Mit *args, können Sie vermeiden, dass zu viel zusätzlichen Code Refactoring:

class Error: 
    feedback_strings = [ 
     "You didn't provide a name and/or mail", 
     "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :", 
     "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :", 
     "You didn't provide a valid year (you used over 4 digits or none)", 
     "You didn't provide a valid year (you used letters)", 
     # You get the idea... 
    ] 

    def __init__(self, *checks): 
     if len(checks) != 16: 
      raise ValueError('16 positional arguments are required') 
     self.checks = [bool(x) for x in checks] 

    def feedbackOnError(self): 
     for index, check in enumerate(self.checks): 
      if not check: 
       return self.feedback_strings[index] 

Dieser Code ist etwa 10-mal kürzer, leichter zu warten und einfacher zu lesen als Ihre vorhandenen Code. Ich empfehle auch, einen Wert von Ihrer Rückmeldungsfunktion zurückzugeben, anstatt eine globale Variable zu setzen. Der Ansatz der globalen Variablen ist eine wirklich schlechte Idee, weil Sie wirklich nicht wissen, wer sie ändern wird.

+0

@andrew. A) Die Spannung bringt mich um. B). Was denkst du "Super ..." tut? –

+0

Das ist ehrlich gesagt schlechtes Design. Die korrekte Verwendung von 'super()' ist als eine [Verantwortlichkeitskette] (https://rhettinger.wordpress.com/2011/05/26/super-considered-super/). Es ist im allgemeinen Fall nicht möglich, dass eine Klasse über alle Klassen informiert, die in der Reihenfolge der Methodenauflösung folgen (zumindest nicht, ohne diese Informationen zur Laufzeit manuell zu untersuchen, was bei einer Standardinitialisierungsmethode einen massiven Overkill darstellt)). Dies wird im allgemeinen Fall nicht funktionieren und sollte entmutigt werden. – Kevin

+0

@ Kevin. Ich kann dir gar nicht mehr beipflichten. Dies ist jedoch, was OP im unmittelbarsten wörtlichen Sinne gefordert hat. –