覆盖模块方法,其中使用from ... import

时间:2012-05-31 07:30:14

标签: python

我有问题覆盖从...使用import语句的方法。举例说明问题:

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

我想在不更改a或b模块中的代码的情况下覆盖print_message(msg)方法。我试过很多方面,但从...导入导入原始方法。当我将代码更改为

import a
a.print_message

比我看到我的变化。

你能建议我如何解决这个问题吗? 提前感谢任何一个小例子。

最好的问候

------------------更新------------------
我试着像下面这样做:

# 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语句的地方。仅适用于导入,但正如我所写,我不希望在b.py和a.py模块中更改代码。

2 个答案:

答案 0 :(得分:38)

在您的ab模块未触及的情况下,您可以尝试按以下方式实施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 :(得分:1)

module1.py

def function1():
    print("module1 function1")
    function2()

def function2():
    print("module1 function2")

module2.py

import module1

test = module1.function1()
print(test) 

""" output
module1 function1
module1 function2
"""
def myfunction():
    print("module2 myfunction")

module1.function2 = lambda: myfunction()

test = module1.function1()
print(test)

"""output
module1 function1
module2 myfunction
"""