2012-03-23 21 views
18

Sono un po 'confuso su come vengono passati gli argomenti tra sottoclassi e superclassi in Python. Si consideri la seguente struttura di classe:Sottoclasse - Argomenti da superclasse

class Superclass(object): 
    def __init__(self, arg1, arg2, arg3): 
     #Inilitize some variables 
     #Call some methods 

class Subclass(Superclass): 
    def __init__(self): 
     super(Subclass, self).__init__() 
     #Call a subclass only method 

Dove Sto avendo difficoltà è capire come argomenti sono passati tra la superclasse e sottoclasse. È necessario ri-elencare tutti gli argomenti Superclass nell'inizializzatore della sottoclasse? Dove dovrebbero essere specificati argomenti nuovi, solo sottoclassi? Quando provo ad usare il codice sopra per creare un'istanza di una sottoclasse, si aspetta solo 1 argomento, non l'originale 4 (incluso il sé) che ho elencato.

TypeError: __init__() takes exactly 1 argument (4 given) 
+1

Si noti che 'richiede esattamente 1 argomento' potrebbe essere fonte di confusione, poiché tale argomento è' self' (che viene passato automaticamente). – katrielalex

risposta

17

Non succede nulla di magico! I metodi __init__ funzionano come tutti gli altri. È necessario prendere esplicitamente tutti gli argomenti necessari nell'inizializzatore della sottoclasse e passarli alla superclasse.

class Superclass(object): 
    def __init__(self, arg1, arg2, arg3): 
     #Initialise some variables 
     #Call some methods 

class Subclass(Superclass): 
    def __init__(self, subclass_arg1, *args, **kwargs): 
     super(Subclass, self).__init__(*args, **kwargs) 
     #Call a subclass only method 

Quando si chiama Subclass(arg1, arg2, arg3) Python basta chiamare Subclass.__init__(<the instance>, arg1, arg2, arg3). Non cercherà magicamente di abbinare alcuni argomenti alla superclasse e alcuni alla sottoclasse.

Problemi correlati