我试图“拦截”对特定模块的所有调用,并将它们重新路由到另一个对象。我想这样做,以便我可以拥有一个相当简单的插件架构。
例如,在 main.py
import renderer
renderer.draw('circle')
在 renderer.py 中
specificRenderer = OpenGLRenderer()
#Then, i'd like to route all calls from main.py so that
#specificRenderer.methodName(methodArgs) is called
# i.e. the above example would call specificRenderer.draw('circle')
这意味着任何函数都可以导入渲染器并使用它,而无需担心细节。这也意味着我可以通过创建另一个对象并将其分配给 renderer.py 中的“specificRenderer”值来完全更改渲染器
有任何想法吗?
在renderer.py:
import sys
if __name__ != "__main__":
    sys.modules[__name__] = OpenGLRenderer()
模块名称现在映射到OpenGLRenderer实例,并且import renderer在其他模块中将获得相同的实例。
实际上,您甚至不需要单独的模块。你可以这样做:
import sys
sys.modules["renderer"] = OpenGLRenderer()
import renderer   # gives current module access to the "module"
... 主模块中的第一件事。renderer在其他模块中的导入将再次引用同一个实例。
你确定你真的想首先这样做吗?人们并不真正期望模块的行为方式。