拦截模块调用?

Bil*_*man 2 python module

我试图“拦截”对特定模块的所有调用,并将它们重新路由到另一个对象。我想这样做,以便我可以拥有一个相当简单的插件架构。

例如,在 main.py

import renderer

renderer.draw('circle')
Run Code Online (Sandbox Code Playgroud)

在 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')
Run Code Online (Sandbox Code Playgroud)

这意味着任何函数都可以导入渲染器并使用它,而无需担心细节。这也意味着我可以通过创建另一个对象并将其分配给 renderer.py 中的“specificRenderer”值来完全更改渲染器

有任何想法吗?

kin*_*all 5

renderer.py

import sys

if __name__ != "__main__":
    sys.modules[__name__] = OpenGLRenderer()
Run Code Online (Sandbox Code Playgroud)

模块名称现在映射到OpenGLRenderer实例,并且import renderer在其他模块中将获得相同的实例。

实际上,您甚至不需要单独的模块。你可以这样做:

import sys
sys.modules["renderer"] = OpenGLRenderer()
import renderer   # gives current module access to the "module"
Run Code Online (Sandbox Code Playgroud)

... 主模块中的第一件事。renderer在其他模块中的导入将再次引用同一个实例。

你确定你真的想首先这样做吗?人们并不真正期望模块的行为方式。

  • 急![遗憾15个字符的最小评论长度] (3认同)