在Python中可以重载from/import吗?

9 投票
2 回答
4389 浏览
提问于 2025-04-16 05:27

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

7

这篇文章展示了如何利用在PEP-302中引入的功能,通过网络导入模块。我发布这篇文章是为了给大家一个如何自定义导入语句的例子,而不是推荐的用法哦;)

撰写回答