1

我正在考虑这样设置的包实现:

wordproc
    __init__.py
    _generic.py
    gedit.py
    oofice.py
    word.py

_generic.py 会有这样的类:

class WordProc (object):

    def __init__ (self):
        pass

    def createNewDoc (self):
        print "createNewDoc unimplemented in current interface"

    def getWordCount (self):
        print "getWordCount unimplemented in current interface"

    etc...

这些可能会如图所示打印出来,或引发错误。特定于应用程序的模块将只是 _generic.py 的副本,其中 WordProc 类派生自 _generic.WordProc。通过这种方式,功能可以随着时间的推移迭代地实现,关于未实现事物的消息只会引发警报。

我想象 __init__.py 可以查找以下内容(按顺序列出)以确定要使用的模块:

  1. wordproc 模块变量
  2. 路径中的设置文件
  3. wordproc 环境变量
  4. 尝试确定环境的函数
  5. __init__.py 中的默认值(可能是 _generic.py)

我认为 3 可以是每个应用程序模块中的一个函数,或者这些可以进入具有特别命名的环境测试脚本(例如 env.py)的文件夹,并且 __init__.py 可以循环它们。

我想在任何想要使用 wordproc 的库中简单地做到这一点:

import wordproc as wp

wp.createNewDoc()
etc...

我不知道如何让 wp 解析到由 __init__.py 确定的正确模块中的正确类。这样做没有意义:

import wordproc.gedit as wp

这破坏了让 __init__.py 确定要使用 wordproc 中的哪个模块的意义。我需要类继承之类的东西,但是在模块级别。

4

1 回答 1

2

你可以这样写来达到你想要的效果__init__.py

  1. 首先导入相应的模块。请参阅有关动态导入的python 文档importlib.import_module或获取帮助。__import__
  2. 实例化要从中导出方法的类
  3. 将实例方法分配给 locals()
# import appropriate module as mod depending on settings, environment
# using importlib.import_module, or __import__

__all__ = []

_instance = mod.WordProc()
for attr in dir(_instance):
    if not attr.startswith('_') and callable(getattr(_instance, attr)):
        locals()[attr] = getattr(_instance, attr)
于 2012-04-22T04:37:55.740 回答