我正在尝试创建一个从类似插件的模块导入其方法的类。
我希望这个类能够从存储在单独文件夹(即“插件”)中的模块导入函数/变量。这可能吗?
我知道__import__()
,但是我如何使用它来导入,以便它们属于此类?
假设我在“插件”文件夹中有以下模块:
plugins/pluginA.py
plugins/pluginB.py
在这些模块中,我有函数等。我希望能够在类中导入和访问它们。也许是这样的:
MyClass.pluginA.some_function_from_A()
MyClass.pluginB.some_function_from_B()
或者也许像这样
MyClass.some_function_fromA()
MyClass.some_function_fromB()
我会将问题分为两部分:将文件列表转换为模块列表,然后扩展该类以包含这些模块中的函数。
布雷特·坎农 (Brett Cannon) 已报道 how to import a module from just a file path ,所以我不会在这里重复...尽管我建议您查看 glob模块。
第二,如何扩展类以包含插件中的功能。我会使用这样的东西:
def extend(obj, plugin_modules):
for module in plugin_modules:
for export_name in dir(module):
export = getattr(module, export_name)
if callable(export):
setattr(obj, export_name, export)
class MyClass(object):
… code …
extend(MyClass, plugin_modules)
但是,我会警告您,这不太可能是您想要的,因为 MyClass
上的“插件”函数的行为不会与 native 方法完全相同......如果您提供有关您想要做什么的更多信息,我也许能够给出更有帮助的答案。
我是一名优秀的程序员,十分优秀!