2012-05-31 10 views
17

Ich habe Problem zu überschreiben Methode, wo von ... Import-Anweisung verwendet wird. Einige Beispiele illustrieren das Problem:Override-Modul-Methode, wo von ... Import verwendet wird

# a.py module 
def print_message(msg): 
    print(msg) 

# b.py module 
from a import print_message 
def execute(): 
    print_message("Hello") 

# c.py module which will be executed 
import b 
b.execute() 

Ich mag würde print_message (msg) -Methode außer Kraft zu setzen, ohne Code in einem oder b Modulwechsel. Ich habe es auf viele Arten versucht, aber von ... Import importiert Originalmethode. Als ich den Code änderte

import a 
a.print_message 

als ich meine Änderung sehe.

Können Sie mir vorschlagen, wie Sie dieses Problem lösen können?
Vielen Dank im Voraus für ein kleines Beispiel.

Mit freundlichen Grüßen

------------------ ------------------ aktualisieren
I versucht, das zu tun, wie unten zB:

Aber das funktioniert nicht, wo ich für ... Import-Anweisung verwende. Arbeitet nur für den Import, aber wie ich geschrieben habe, will ich Code in b.py und a.py Modulen nicht ändern.

+0

(1) Was genau meinen Sie mit "override"? Affe Patch? (2) In dem Code, den Sie präsentieren, gibt es nur eine 'print_message()'. – NPE

+0

Ich möchte die Methode print_message() ändern, um z. Nachricht "Neuer Inhalt" Wie erreicht man das aus der c.py Datei ohne Änderungen in a.py und b.py? – Pawel

+0

zur Erklärung und Demonstration von "Affe Patch": http://Stackoverflow.com/a/6647776/1498405 – hardmooth

Antwort

29

Mit Ihrem a und b Module unangetastet Sie versuchen c Implementierung könnte wie folgt aussehen:

import a 

def _new_print_message(message): 
    print "NEW:", message 

a.print_message = _new_print_message 

import b 
b.execute() 

Sie zum ersten Import haben a, dann die Funktion außer Kraft setzen und dann importieren b so, dass es das a Modul verwenden würde, die ist bereits importiert (und geändert).

+1

Ihr Code funktioniert. Mein Fehler war, dass ich import b Anweisung vor der Methode print_message überschreiben. Mit dem Import b nach a.print_message = _new_print_message Code funktioniert. Danke für die Hilfe. – Pawel

+0

PEP-8 empfiehlt, alle Importanweisungen an den Anfang des Moduls zu setzen. Es ist dasselbe wie eine Include-Anweisung in der Mitte einer CPP-Datei. Du wirst einfach in einer Welt des Schmerzes enden. – Steztric

Verwandte Themen