【发布时间】:2013-01-24 20:38:37
【问题描述】:
我目前正在编写一个允许用户通过“插件”类型架构扩展它的应用程序。他们可以基于我提供的 BaseClass 对象编写额外的 python 类,这些类是针对各种应用程序信号加载的。作为插件加载的类的确切数量和名称在应用程序启动之前是未知的,但仅在启动时加载一次。
在研究解决此问题的最佳方法期间,我提出了两种常见的解决方案。
选项 1 - 使用 imp、pkgutil 等自行开发。
例如,请参阅 this answer 或 this one。
选项 2 - 使用插件管理器库
随机挑选一对
我的问题是 - 前提是必须重新启动应用程序才能加载新插件 - 上述方法是否比受 this SO answer 和 this one 启发的东西有任何好处,例如:
import inspect
import sys
import my_plugins
def predicate(c):
# filter to classes
return inspect.isclass(c)
def load_plugins():
for name, obj in inspect.getmembers(sys.modules['my_plugins'], predicate):
obj.register_signals()
与上述方法相比,这种方法有什么缺点吗? (除了所有插件必须在同一个文件中)谢谢!
编辑
评论请求更多信息......我能想到的唯一额外的事情是插件使用blinker库来提供他们订阅的信号。每个插件可以订阅不同类型的不同信号,因此必须有自己特定的“注册”方法。
【问题讨论】:
-
如果您使用的是this approach,则不需要
load_plugins和predicate函数。这是我建议的。 -
谢谢 - 是的,我确实看到了那篇文章......这是一个很好的方法。但是,由于每个插件都有不同的注册功能,我大概需要遍历插件并分别调用注册?这似乎比上面的要复杂得多?
-
你需要多解释一下你到底想要什么。如果您使用文章中的想法,您的
Base类将有一个包含所有Plugins注册的类属性。