2014-12-19 16 views
6

Ricevo una differenza inspiegabile nel comportamento tra l'utilizzo di super().__init__() e la chiamata esplicita di un costruttore di super classe nel mio codice.Differenza di comportamento tra super() .__ init __() e superclasse esplicita __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) 

Qui, la linea super().__init__(self, ip_type=ip_type) risultati in un errore di tipo:

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

Quando cambio la chiamata per passare ip_type per posizione (es super().__init__(self, ip_type) ottengo un errore differente tipo:

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

Nessuno di questi errori ha senso per me e quando sostituisco super() con il nome esplicito della superclasse, tutto funziona come previsto. I seguenti funziona bene, come fa passando ip_type in base alla posizione:

class IPAddressSimple(IPElement): 

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

posso certamente utilizzare una chiamata esplicita al metodo della superclasse __init__ se necessario, ma vorrei capire perché super() non funziona qui.

risposta

3

super() già passa self insieme per voi. super(IPAddressSimple) non saprebbe di self, quindi in tal caso avresti bisogno di chiamare super(IPAddressSimple).__init__(self, ip_type). Ma super() (che è zucchero sintattico per super(IPAddressSimple, self)) conosce self e lo gestisce, quindi è necessario passare solo ip_type manualmente.

+1

Come sempre, i problemi più sconcertanti si rivelano avere le spiegazioni più semplici. Grazie per la risposta chiara e concisa! – qdet