我正在考虑设置这样的包实现:
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可以查找以下内容(按顺序列出)以确定要使用的模块:
我认为3可以是每个应用程序模块中的一个函数,或者这些函数可以放入具有特别命名的环境测试脚本(例如env.py)的文件夹中,而__ init__.py可以循环遍历它们。
我希望在任何想要使用wordproc的库中能够做到这一点:
import wordproc as wp
wp.createNewDoc()
etc...
我不知道的是如何让wp解析到__init__.py确定的适当模块中的正确类。这样做是没有意义的:
import wordproc.gedit as wp
这破坏了让__init__.py确定要使用的wordproc中的哪个模块的观点。我需要类继承,但在模块级别。
答案 0 :(得分:2)
您可以通过这样写__init__.py
来实现您想要的效果:
importlib.import_module
或__import__
上的python文档。# 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)