2016-06-07 43 views
6

Ho due classi un genitore e un altro figlio.Aggiunta di funzionalità aggiuntive al metodo della classe padre senza cambiarne il nome

class Parent(object): 

    def __init__(self): 
     #does something 

    def method_parent(self): 
     print "Parent" 

class Child(Parent): 

    def __init__(self): 
     Parent.__init__(self) 

    def method_parent(self): 
     print "Child" 

Dopo aver ereditato il genitore che voglio modificare il metodo Parent method_parent mantenendo la funzionalità originale di tale metodo e l'aggiunta di alcune linee extra di codice a tale metodo.

so che posso creare un nuovo metodo come

def method_child(self): 
    self.method_parent() 
    #Add extra lines of code to perform something 

ma voglio utilizzare il nome originale del metodo. Non riesco a copiare il codice sorgente per questo metodo perché, il metodo è da un modulo

C quello che voglio ottenere è qualcosa di simile

def method_parent(): 
    #do parent_method stuff 
    #do extra stuff 

è che anche possibile?

risposta

6

È sempre possibile chiamare il codice dal genitore utilizzando la funzione di super(). Dà un riferimento al genitore. Quindi, per chiamare parent_method(), è necessario utilizzare super().parent_method().

Ecco uno snippet di codice (per python3) che mostra come utilizzarlo.

class ParentClass: 
    def f(self): 
     print("Hi!"); 

class ChildClass(ParentClass): 
    def f(self): 
     super().f(); 
     print("Hello!"); 

In python2, è necessario chiamare eccellente con argomenti extra: super(ChildClass, self). Così, il frammento di diventerebbe:

class ParentClass: 
    def f(self): 
     print("Hi!"); 

class ChildClass(ParentClass): 
    def f(self): 
     super(ChildClass, self).f(); 
     print("Hello!"); 

Se si chiama f() su un'istanza di ChildClass, mostrerà: "Ciao Ciao".

Se si è già codificati in Java, è fondamentalmente lo stesso comportamento. Puoi chiamare super ovunque tu voglia. In un metodo, nella funzione init, ...

Ci sono anche altri modi per farlo, ma è meno pulito. Ad esempio, puoi fare:

ParentClass.f(self) 

Per chiamare la funzione f della classe genitore.

4

Questo è ciò che fa la funzione super.

class Child(Parent): 

    def __init__(self): 
     super(Child, self).__init__() 

    def method_parent(self): 
     super(Child, self).method_parent() 
     print "Child" 

In Python 3, è possibile chiamare super senza gli argomenti, come super().method_parent()

1

è possibile chiamare il metodo padre esattamente nello stesso modo utilizzato per la __init__ uno:

class Child(Parent): 

    def __init__(self): 
     Parent.__init__(self) 

    def method_parent(self): 
     Parent.method_parent(self) # call method on Parent 
     print "Child" 

Questo è quando si vuole nominare esplicitamente la classe padre. Se preferisci, puoi chiedere a python di fornirti la prossima classe in Method Resolution Order usando super:

def method_parent(self): 
     super(Child, self).method_parent() # call method on Parent 
     print "Child"