我有一个插件式模块包。看起来像这样:
/Plugins /Plugins/__init__.py /Plugins/Plugin1.py /Plugins/Plugin2.py etc...
每个.py文件都包含一个从PluginBaseClass
派生的类。所以我需要列出Plugins
包中的每个模块,然后搜索实现PluginBaseClass
的任何类。理想情况下,我希望能够做这样的事情:
我也看到了其他答案,但我的情况不同。我有一个到基本包的实际导入(即:import project.Plugins
),我需要在发现模块之后找到类。在
您可以(也可能应该)将
__init__.py
中的__all__
定义为包中的子模块列表;这样就可以支持人们执行from Plugins import *
。如果已经这样做了,那么可以使用这里发布的另一个答案失败的原因是
__import__
导入了最低级别的模块,但是返回了顶层模块(参见docs)。我不知道为什么。在扫描模块不是个好主意。如果需要类注册表,则应查看metaclasses或使用现有的解决方案,如zope.interface。 通过元类的简单解决方案可能如下所示:
编辑:这是一个修正的解决方案。我意识到我在测试上一个错误时犯了一个错误,它并没有像你期望的那样工作。所以这里有一个更完整的解决方案:
我以前的解决方案是:
你可以尝试一下:
^{pr2}$实际上,更好的是,如果你想要一些模块化:
相关问题 更多 >
编程相关推荐