【问题标题】:Is it possible to overload from/import in Python?是否可以在 Python 中从/导入重载?
【发布时间】:2010-10-13 21:08:10
【问题描述】:

是否可以在 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

【问题讨论】:

  • @S.Lott 本质上,我想从远程 JVM(在 Python 程序中)导入包和类,虽然我可以提供导入方法,但我想重用 Python 语法。跨度>
  • “从远程 JVM 导入包和类”?不是文件?这将如何运作?您将如何管理 .pyc 文件的创建? “文件”有什么问题?他们工作得很好。远程挂载文件系统有什么问题?效果很好。
  • @S.Lott 无需在评论中提出 6 个问题。我为我正在从事的 Py4J 项目提出了这个问题:py4j.sourceforge.net
  • 为什么每个人都希望提问者不知道他在说什么?两个答案和一个评论让他更聪明。如果你们都认为导入钩子是一个愚蠢的想法,为什么你们不都接受 PEP 302 和那里的 Python 开发人员呢?
  • @Muhammad Alkarouri 也许我不够清楚。我的意思是从任意远程网站实际导入模块的“建议使用”,这是我链接到的代码的作者也给出的警告。但是,它是如何自定义导入过程(具有各种“严重”用途)的一个很好的例子,所以我链接到它。我绝不是要贬低 OP。

标签: python import operator-overloading


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多