导入后覆盖模块功能 - Python

Overriding module function after it is imported - Python

假设我们有三个 python 模块:app.py、commons.py 和 c.py

commons.py:

def func():
    pass

def init(app)
    global func
    func = app.func

app.py:

import commons
import c
# Doing some initialization so that we are ready to override the function
c.foo()
init(app) # the app object contains a function called func which we wish to overwrite in commons.py
c.foo()

c.py:

from commons import *
def foo():
    func()

我要实现的是第一次调用c.foo什么都不做,第二次调用app.func。我项目中的每个模块都依赖于 commons.py 中的函数,并且该函数必须在运行时声明,因为它附加到一个对象。

有没有办法在python中通过引用导入并改变所有模块中函数的指针?

到目前为止我所做的是在每个模块中都有一个 init 函数并简单地覆盖空的 lambda 函数,但这似乎是一个糟糕的解决方案。

您可以通过更高级别的间接访问来实现此目的:

commons.py

def normalFunc():
    pass
def func():
    normalFunc()

def init(app)
    global normalFunc
    normalFunc = app.func

这行得通,因为任何其他具有正常的模块:from commons import foofoo() 仍然调用相同的 foo().

只是每次调用 init() 函数时,foo() 的内部结构都会发生变化。