在Python中可以重载from/import吗?
在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
2 个回答
4
在像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()
函数会被删除。这样做的好处是,你可以在模块中循环,甚至在这个循环中给模块添加对象,这在某些情况下非常有用(但要小心使用!)。