2014-12-19 3 views
6

Ich bekomme einen unerklärlichen Unterschied im Verhalten zwischen super().__init__() und explizit einen Super-Klasse-Konstruktor in meinem Code aufrufen.Verhalten Unterschied zwischen super() .__ init __() und explizite Oberklasse __init __() in Python

class IPElement(object): 

def __init__(self, ip_type='IPv4'): 
    self.ip_type = ip_type 

class IPAddressSimple(IPElement): 

    def __init__(self, ip_name, ip_type='IPv4'): 
     self.ip_name = ip_name 
     super().__init__(self, ip_type=ip_type) 

Hier ist die Linie super().__init__(self, ip_type=ip_type) Ergebnisse in einer Art Fehler:

TypeError: __init__() got multiple values for argument 'ip_type' 

Wenn ich den Anruf ändern ip_type von Position zu gelangen (zB super().__init__(self, ip_type) ich eine andere Art Fehler:

TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given 

Keiner dieser Fehler macht Sinn für mich, und wenn ich super() durch den expliziten Namen der Oberklasse, alles ersetzen funktioniert wie erwartet. Die folgenden funktioniert gut, ebenso wie ip_type von Position vorbei:

class IPAddressSimple(IPElement): 

     def __init__(self, ip_name, ip_type='IPv4'): 
      self.ip_name = ip_name 
      IPElement.__init__(self, ip_type=ip_type) 

ich sicherlich einen expliziten Aufruf der übergeordneten Klasse __init__ Methode bei Bedarf verwenden können, aber ich möchte verstehen, warum super() ist hier nicht arbeiten.

Antwort

3

super() geht bereits self für Sie mit. super(IPAddressSimple) würde nicht über self wissen, also in diesem Fall müssten Sie super(IPAddressSimple).__init__(self, ip_type) anrufen. Aber super() (das ist syntaktischer Zucker für super(IPAddressSimple, self)) kennt self und behandelt es, so dass Sie nur ip_type manuell übergeben sollten.

+1

Wie immer, die meisten verwirrenden Probleme stellen sich heraus, um die einfachsten Erklärungen zu haben. Danke für die klare, prägnante Antwort! – qdet

Verwandte Themen