python中定义插件的不同策略也可以在其定义fram之外运行

2024-09-30 08:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

场景如下:

我正在构建一个使用外部脚本作为插件的框架。人们将能够为符合某些接口的脚本创建“适配器”。这些适配器要么集成到框架中(因此需要插件注册),要么通过简单的导入“松散地”使用。在

换句话说,适配器用于脚本使用标准化。在

我的想法可能太复杂了,但我目前所采用的解决方案包括创建一个定义接口的抽象类(以及一些实用程序方法)。抽象类的模块将只加载一次,框架将加载一个带有自注册元类的版本,而插件本身将加载一个更简单的版本(第一个注册抽象类的获胜)。在

这就迫使插件有一个文件来定义抽象类,从而定义“契约”。我不认为这有什么问题。在

我并不是真的有两个不同的抽象类,而是在一个模块文件中有一个单独的类,它的行为与加载的位置不同(框架或插件本身)。但这不应该是相关的(我认为)。在

这就是抽象类/元类的样子

#imp/plugin.py
import abc
class PluginAbstract(object):
    class __metaclass__(abc.ABCMeta):
        def __init__(self, name, bases, namespace):
            if name != 'PluginAbstract':
                pass #We can register the new "sub-class" if required
            return abc.ABCMeta.__init__(abc.ABCMeta, name, bases, namespace)

具体实施方式如下:

^{pr2}$

因此,如果框架已经注册了PluginAbstract,那么这个框架将被继承,如果不是来自合同文件impl/plugin.py的框架将被使用。在

我不希望适配器要求安装框架,因此需要安装具有接口的单个文件。在

这个策略有道理吗?还有其他选择吗?在


Tags: 模块文件name版本脚本插件框架定义
1条回答
网友
1楼 · 发布于 2024-09-30 08:20:24

在Python中,“强制”接口是不寻常的。我们通常使用duck类型,这是契约式设计或其他“约束和约束”方法的常识性替代方法。鸭子打字意味着,如果它走路像鸭子,嘎嘎叫得像鸭子,它一定是鸭子。在

实际上,这意味着您不需要强制执行静态类型。相反,您相信,有了正确的文档,代码的用户只会做正确的事情。这通常会大大简化代码。它也会让你专注于真正重要的事情,比如检查有效的输入数据。在

在静态类型背景下的人,如java或C++,鸭子打字通常会引起某种存在主义焦虑,比如在深渊中寻找深渊。放手吧。没有深渊,只有在你的心里。在

相关问题 更多 >

    热门问题