35

from...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()

print_message(msg)a または b モジュールのコードを変更せずにメソッドをオーバーライドしたいと思います。私は多くの方法で試しましたがfrom...import、元の方法をインポートします。コードを次のように変更したとき

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

しかし、これはfor...importステートメントを使用している場所では機能しません。import a に対してのみ機能していますが、私が書いたように、 b.py および a.py モジュールのコードを変更したくありません。

4

2 に答える 2

58

aモジュールとモジュールをそのままにして、次のようにb実装してみてください。c

import a

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

a.print_message = _new_print_message

import b
b.execute()

最初に import をインポートaし、次に関数をオーバーライドしてからインポートして、既にインポートされた (および変更された) モジュールをb使用するようにする必要があります。a

于 2012-05-31T07:44:47.773 に答える
0

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
"""
于 2021-06-08T06:45:12.807 に答える