Python 中可以重载 from/import 吗?

发布于 2024-09-27 12:14:06 字数 272 浏览 4 评论 0原文

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

Is it possible to overload the from/import statement in Python?

For example, assuming jvm_object is an instance of class JVM, is it possible to write this code:

class JVM(object):

  def import_func(self, cls):
    return something...

jvm = JVM()

# would invoke JVM.import_func
from jvm import Foo

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

送你一个梦 2024-10-04 12:14:06

这篇文章演示了如何使用介绍的功能在 PEP-302 中通过网络导入模块。我将其发布为如何自定义导入语句的示例,而不是建议的用法;)

This post demonstrates how to use functionality introduced in PEP-302 to import modules over the web. I post it as an example of how to customize the import statement rather than as suggested usage ;)

少年亿悲伤 2024-10-04 12:14:06

很难找到像 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() 函数将被删除。这样做的优点是,您可以循环模块,甚至可以在循环内向模块添加对象,这有时非常有用(但请谨慎使用!)。

It's hard to find something which isn't possible in a dynamic language like Python, but do we really need to abuse everything? Anyway, here it is:

from types import ModuleType
import sys

class JVM(ModuleType):
    Foo = 3

sys.modules['JVM'] = JVM

from JVM import Foo
print Foo

But one pattern I've seen in several libraries/projects is some kind of a _make_module() function, which creates a ModuleType dynamically and initializes everything in it. After that, the current Module is replaced by the new module (using the assignment to sys.modules) and the _make_module() function gets deleted. The advantage of that, is that you can loop over the module and even add objects to the module inside that loop, which is quite useful sometimes (but use it with caution!).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文