是否有可能从Python中的/ import重载?

时间:2010-10-13 21:08:11

标签: python import operator-overloading

是否可以在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 个答案:

答案 0 :(得分:7)

This post演示了如何使用PEP-302中引入的功能通过Web导入模块。我发布它作为如何自定义import语句而不是建议用法的示例;)

答案 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()函数被删除。这样做的好处是,你可以遍历模块,甚至可以在该循环中向模块添加对象,这有时非常有用(但请谨慎使用!)。