是否可以在Python中重载from / import语句?
例如,假设jvm_object
是类JVM
的实例,是否可以编写此代码:
class JVM(object):
def import_func(self, cls):
return something...
jvm = JVM()
# would invoke JVM.import_func
from jvm import Foo
答案 0 :(得分:7)
答案 1 :(得分:3)
很难找到像Python这样的动态语言无法实现的东西,但是我们真的需要滥用一切吗?无论如何,这是:
from types import ModuleType
import sys
class JVM(ModuleType):
Foo = 3
sys.modules['JVM'] = JVM
from JVM import Foo
print Foo
但是我在几个库/项目中看到的一种模式是某种_make_module()
函数,它动态创建ModuleType
并初始化其中的所有内容。之后,当前模块被新模块替换(使用赋值给sys.modules
),_make_module()
函数被删除。这样做的好处是,你可以遍历模块,甚至可以在该循环中向模块添加对象,这有时非常有用(但请谨慎使用!)。