2016-06-04 14 views
0

Ich habe ein kleines Dilemma wo in fileB Ich muss auf Klasse classC aufrufen, aber bevor ich das tun, muss ich functionA überschreiben. Ich bin mir nicht sicher, wie ich das machen soll. Danke für jede Hilfe im Voraus!Wie überschreibe ich Methode in Python?

#fileA 

class classA(): 
    def functionA(): 
     print('Hello World!') 


class classB(classA): 
    pass 

class classC(classB): 
    pass 


#fileB 

from fileA import classC 
#overwrite functionA 
classC() 
+0

Ich bin mir nicht sicher, was Sie erreichen möchten. Sie können dieselbe Syntax in 'fileB' verwenden, um' classC' wie in 'fileA' zu überschreiben. Gibt es eine Methode, die du dynamisch in 'fileB' definierst? – rmorshea

Antwort

3

Die „richtige“ Art und Weise, was Sie tun möchten, ist zu Überschreibung das Verfahren, es ist nicht zu überschreiben. Sie tun dies, indem Sie eine Unterklasse der Klasse erstellen und eine neue Definition für eine oder mehrere ihrer Methoden bereitstellen.

Vor allem wenn es einen Fehler in der Definition von classA.functionA() - Sie self Argument enthalten müssen:

class classA: 
    def functionA(self): 
     print('Hello World!') 

Damit korrigierte Sie dann eine neue Unterklasse von classC in fileB.py definieren müssen, die überschreibt functionA():

from fileA import classC 

class classD(classC): 
    def functionA(self): 
     print('classD.functionA(): Hello World!') 

>>> c = classC() 
>>> c.functionA() 
Hello World! 

>>> d = classD() 
>>> d.functionA() 
classD.functionA(): Hello World! 

Es ist erwähnenswert, dass Klassen classB und classC sinnlos erscheinen gegeben, dass (wie gezeigt) Sie nehmen keine Änderungen an der Basisklasse A vor. Sie könnten also direkt classA ableiten.

Dies ist das grundlegendste objektorientierte Design/Programmierung, also schlage ich vor, dass Sie sich ein oder zwei Tutorials anschauen.

Wie ich oben sagte, ist dies der richtige Weg, um es zu tun. Sie können die Methode auch wie folgt ersetzen/überschreiben:

Aber überschreiben ist vorzuziehen, es zu überschreiben. Ein Problem besteht darin, dass beim Überschreiben der Methode alle bereits vorhandenen Instanzen von classC ebenfalls betroffen sind, wie in der letzten Zeile des obigen Codes gezeigt.

+0

Eine kurze Anmerkung für Ihre abschließende Anweisung: Sie können auch eine Instanz von classC erstellen und dann nur die Instanz my_function_A dieser Instanz überschreiben. Dies wird ClassC selbst unberührt lassen. –

+0

@JoelHarmon: Ja, das ist richtig, aber ich habe versucht zu demonstrieren, dass Affepatching unbeabsichtigte Nebenwirkungen haben könnte. – mhawke

+0

Ich stimme zu, dass es Probleme verursachen kann (und auch Vorteile bietet, wie jeder andere Kompromiss). Da Sie in Ihrer Antwort jedoch monkeypatching erwähnt haben, ist es besser, eine vollständigere/genauere Darstellung zu liefern. Wie geschrieben, gilt Ihr letzter Satz nur für eine Verwendung von monkeypatching, und daher finde ich es irreführend. –

0

Der Name der Technik, nach der Sie suchen, ist monkeypatching.

Funktionen in Python sind erstklassige Objekte. So können Sie sie einfach einer Klasse oder einem Objekt zuweisen. Das bedeutet, dass Sie zwei Objekte haben können, die Instanzen derselben Klasse sind und zwei verschiedene Methoden aufrufen, obwohl derselbe Name aufgerufen wurde. Sie müssen nicht einmal mit dem gleichen Namen oder gar irgendeinem Namen definiert werden; Ich sehe dich an, Lambda.