Python - 类可以像模块一样吗?

时间:2012-04-22 04:20:31

标签: python package

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

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)
  6. 我认为3可以是每个应用程序模块中的一个函数,或者这些函数可以放入具有特别命名的环境测试脚本(例如env.py)的文件夹中,而__ init__.py可以循环遍历它们。

    我希望在任何想要使用wordproc的库中能够做到这一点:

    import wordproc as wp
    
    wp.createNewDoc()
    etc...
    

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

    import wordproc.gedit as wp
    

    这破坏了让__init__.py确定要使用的wordproc中的哪个模块的观点。我需要类继承,但在模块级别。

1 个答案:

答案 0 :(得分:2)

您可以通过这样写__init__.py来实现您想要的效果:

  1. 首先导入相应的模块。有关动态导入的帮助,请参阅importlib.import_module__import__上的python文档。
  2. 实例化要从中导出方法的类
  3. 将实例方法分配给locals()
  4. # 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)