2012-05-31 2 views
17

У меня есть проблема, чтобы переопределить метод where from ... import statement используется. Некоторые примеры, чтобы проиллюстрировать эту проблему:Переопределить метод модуля, где из ... импорт используется

# 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() 

я хотел бы переопределить метод print_message (MSG) без изменения кода в модуле А или Б. Я пытался во многих отношениях, но из ... импорт импортирует оригинальный метод. Когда я сменил код на

import a 
a.print_message 

чем я вижу мое изменение.

Не могли бы вы предложить мне, как решить эту проблему?
Заранее благодарим за любой маленький пример.

С наилучшими пожеланиями

------------------ Обновление ------------------
I попытался сделать это, например, ниже:

# c.py module 
import b 
import a 
import sys 
def new_print_message(msg): 
    print("New content") 
module = sys.modules["a"] 
module.print_message = new_print_message 
sys.module["a"] = module 

Но это не работает, когда я использую для ... import statement. Я работаю только для импорта, но, как я писал, я не хочу менять код в b.py и a.py.

+0

(1) Что именно вы подразумеваете под «переопределением»? Патч обезьяны? (2) В коде, который вы представляете, есть только один 'print_message()'. – NPE

+0

Я хочу изменить метод print_message() для печати, например. Сообщение «Новый контент». Как добиться этого из файла c.py без изменения в файлах a.py и b.py? – Pawel

+0

для объяснения и демонстрации «патча обезьяны»: http://stackoverflow.com/a/6647776/1498405 – hardmooth

ответ

29

С вашими a и b модулей нетронутых вы могли попробовать реализовать c следующим образом:

import a 

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

a.print_message = _new_print_message 

import b 
b.execute() 

Вы должны сначала импортировать a, а затем переопределить функцию, а затем импортировать b так, что он будет использовать a модуль, уже импортирован (и изменен).

+1

Ваш код работает. Моя ошибка заключалась в том, что я поместил инструкцию import b перед переопределением метода print_message. С импортом b после работы a.print_message = _new_print_message. Спасибо за помощь. – Pawel

+0

PEP-8 рекомендует помещать все операторы импорта в верхней части модуля. Это то же самое, что с предложением include в середине файла .cpp; вы просто окажетесь в мире боли. – Steztric

Смежные вопросы