oop - 在 Python 中启用用户代码扩展的流行技术是什么?

标签 oop python-3.x python

我正在寻找允许用户覆盖应用程序中的模块或使用新模块扩展应用程序的技术。

想象一个名为 pydraw 的应用程序。目前提供了一个Circle类,继承了Shape。包树可能如下所示:

/usr/lib/python/
└── pydraw
    ├── __init__.py
    ├── shape.py
    └── shapes
        ├── circle.py
        └── __init__.py

现在假设我想启用动态发现和加载实现新形状的用户模块,甚至可能是 Shape 类本身。用户的树与应用程序树具有相同的结构似乎是最直接的,例如:

/home/someuser/python/
└── pydraw
    ├── __init__.py
    ├── shape.py       <-- new superclass
    └── shapes
        ├── __init__.py
        └── square.py   <-- new user class

换句话说,我想用用户树中的同名文件覆盖和屏蔽应用程序树,或者至少从 Python 的角度获得明显的结构。

然后,通过配置 sys.path 或 PYTHONPATH,可能会发现 pydraw.shapes.square。但是,Python 的模块路径搜索并没有找到诸如 square.py 之类的模块。我认为这是因为 __method__ 已经在另一个路径上包含了一个父模块。

您将如何使用 Python 完成这项任务?

最佳答案

扩展的发现可能有点脆弱和复杂,并且还需要您查看所有可能非常大的 PYTHONPATH。

相反,有一个配置文件列出了应该加载的插件。这可以通过将它们列为模块名称来完成,并且还要求它们位于 PYTHONPATH 中,或者通过简单地列出完整路径来完成。

如果你想要每个用户级别的配置,我会同时拥有一个列出模块的全局配置文件和一个每个用户的配置文件,并且只读取这些配置文件而不是尝试一些发现机制。

此外,您不仅要尝试添加插件,还要覆盖应用程序的组件。为此,我会使用 Zope Component Architecture。然而,它还没有完全移植到 Python 3,但它被设计用于这种情况,尽管从你的描述来看这似乎是一个简单的情况,而且 ZCA 可能有点矫枉过正。但无论如何都要看看。

关于oop - 在 Python 中启用用户代码扩展的流行技术是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7201397/

相关文章:

java - 无法调用初始化为父类(super class)的 ArrayList 中派生类的方法

android - 已解决 : Buildozer kivy App crashes on Android right after opening

python - 为什么 django 忽略线路中的 HTTP_X_FORWARDED_PROTO 而不是在测试中?

基于Python文本的游戏显示

c++ - 为静态库编译 SWIG Python 包装器?

java - “使用静态数组”...这是什么意思?

php - 在 namespace 声明中定义相同 namespace 的使用是一种好习惯吗?

java - 在 Java 中处理无效输入

python - 在 IPython 中控制列表可视化

python - `readline` 、 `readlines` 、 `writeline` 和 `writelines` 是否需要 `file` 对象 `f` 以文本模式而不是二进制模式打开?