返回顶部
首页 > 资讯 > 后端开发 > Python >Python搭建插件式框架(基于组件开发
  • 867
分享到

Python搭建插件式框架(基于组件开发

组件插件框架 2023-01-31 04:01:48 867人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

python搭建插件式框架(基于组件开发) 概念 基于组件的开发(Component-Based Development,简称CBD)是一种软件开发范型。它是现今软件复用理论实用化的研究热点,在组件对象模型的支持下,通过复用已有

python搭建插件框架(基于组件开发

概念

基于组件的开发(Component-Based Development,简称CBD)是一种软件开发范型。它是现今软件复用理论实用化的研究热点,在组件对象模型的支持下,通过复用已有的构件,软件开发者可以“即插即用”地快速构造应用软件。

优点

  • 灵活性高:各个功能模块之间的耦合很低,每一个组件都是独立的,它附着在整个插件框架上执行,真正的实现有则加载,无则忽略。

  • 复用性强:由于组件之间的通信或者交互都是通过插件框架提供的接口来执行,各个组件之见是遵守依赖倒置原则的。所以无论需要哪个模块的功能,都只需要将该插件直接拿走复用即可。

框架描述

    之前有这么一个有趣的笑话。说一个人一大早起来想吃火锅,但是他又不想出门,于是他想了个主意,他给A打电话说:今天请大家吃火锅,别的东西都有了,就差一份羊肉了,来的时候带着。完了给B打电话说:今天请大家吃火锅,别的东西都有的,火锅料忘了买了,来的时候捎上……,他用这样的方法将所有的菜凑够,足不出户,就能吃火锅,而且想吃啥就吃啥。

    这个例子中,这个在家里想吃火锅并且挨个给大家打电话的人便是插件式框架中的总框架,本身不提供任何的功能,角色就是总指挥。而小A,小B这些朋友则是各个组件,自己只负责自己的部分,但是每一个组件都无法单独执行,只能在总框架中执行。组件为整个开发提供基本的功能,组件之间的通信也都是通过总框架来实现的,这就是整个插件式框架。

实现

    相信点开看这篇文章的都是有一定Python基础并且遇到类似于插件式开发需求,从而来看一份有用的代码,再将其拷贝走的。话不多说,上代码吧。

目录结构

++PluginFrame

– main.py

– PluginManager

++ Plugins

-- Plugin1.py

-- Plugin2.py

-- Plugin3.py

-- Plugin4.py
### 插件式框架
import os
import sys
from imp import find_module
from imp import load_module

class PluginManager(type):
    #静态变量配置插件路径
    __PluginPath = 'Plugins'

    #调用时将插件注册
    def __init__(self,name,bases,dict):
        if not hasattr(self,'AllPlugins'):
            self.__AllPlugins = {}
        else:
            self.ReGISterAllPlugin(self)

    #设置插件路径
    @staticmethod
    def SetPluginPath(path):
        if os.path.isdir(path):
            PluginManager.__PluginPath = path
        else:
            print '%s is not a valid path' % path

    #递归检测插件路径下的所有插件,并将它们存到内存中
    @staticmethod
    def LoadAllPlugin():
        pluginPath = PluginManager.__PluginPath
        if not os.path.isdir(pluginPath):
            raise EnvironmentError,'%s is not a directory' % pluginPath

        items = os.listdir(pluginPath)
        for item in items:
            if os.path.isdir(os.path.join(pluginPath,item)):
                PluginManager.__PluginPath = os.path.join(pluginPath,item)
                PluginManager.LoadAllPlugin()
            else:
                if item.endswith('.py') and item != '__init__.py':
                    moduleName = item[:-3]
                    if moduleName not in sys.modules:
                        fileHandle, filePath,dect = find_module(moduleName,[pluginPath])
                    try:
                        moduleObj = load_module(moduleName,fileHandle,filePath,dect)
                    finally:
                        if fileHandle : fileHandle.close()

    #返回所有的插件
    @property
    def AllPlugins(self):
        return self.__AllPlugins

    #注册插件
    def RegisterAllPlugin(self,aPlugin):
        pluginName = '.'.join([aPlugin.__module__,aPlugin.__name__])
        pluginObj = aPlugin()
        self.__AllPlugins[pluginName] = pluginObj

    #注销插件
    def UnregisterPlugin(self,pLuginName):
        if pluginName in self.__AllPlugins:
            pluginObj = self.__AllPlugins[pluginName]
            del pluginObj

    #获取插件对象。
    def GetPluginObject(self, pluginName = None):
        if pluginName is None:
            return self.__AllPlugins.values()
        else:
            result = self.__AllPlugins[pluginName] if pluginName in self.__AllPlugins else None
            return result

    #根据插件名字,获取插件对象。(提供插件之间的通信)
    @staticmethod
    def GetPluginByName(pluginName):
        if pluginName is None:
            return None
        else:
            for SingleModel in __ALLMODEL__:
                plugin = SingleModel.GetPluginObject(pluginName)
                if plugin:
                    return plugin

#插件框架的接入点。便于管理各个插件。各个插件通过继承接入点类,利用Python中metaclass的优势,将插件注册。接入点中定义了各个插件模块必须要实现的接口。
class Model_Component(object):
    __metaclass__ = PluginManager

    def Start(self):
        print 'Please write the Start() function'

    def ChangeLanguage(self,language):
        print 'Please write the ChangeLanguage() function'

class Model_MenuObj(object):
    __metaclass__ = PluginManager

    def Start(self):
        print 'Please write the Start() function'

    def ChangeLanguage(self,language):
        print 'Please write the ChangeLanguage() function'

class Model_ToolBarObj(object):
    __metaclass__ = PluginManager

    def Start(self):
        print 'Please write the Start() function'

    def ChangeLanguage(self,language):
        print 'Please write the ChangeLanguage() function'

class Model_ParamPanelObj(object):
    __metaclass__ = PluginManager

    def Start(self):
        print 'Please write the Start() function'

    def ChangeLanguage(self,language):
        print 'Please write the ChangeLanguage() function'

__ALLMODEL__ = (Model_ParamPanelObj,Model_ToolBarObj,Model_MenuObj,Model_Component)
#插件1
from PluginManager import Model_MenuObj

class Plugin1(Model_MenuObj):
    def __init__(self):
        pass

    #实现接入点的接口
    def Start(self):
        print "I am plugin1 , I am a menu!"
#插件2
from PluginManager import Model_ToolBarObj

class Plugin2(Model_ToolBarObj):
    def __init__(self):
        pass

    def Start(self):
        print "I am plugin2 , I am a ToolBar!"
#插件3
from PluginManager import Model_ParamPanelObj

class Plugin3(Model_ParamPanelObj):
    def __init__(self):
        pass

    def Start(self):
        print "I am plugin3 , I am a ParamPanel!"
#插件4
from PluginManager import Model_Component

class Plugin4(Model_Component):
    def __init__(self):
        pass

    def Start(self):
        print "I am plugin4 , I am a Component!"
#main调用

import sys
from PluginManager import PluginManager
from PluginManager import __ALLMODEL__

if __name__ == '__main__':
    #加载所有插件
    PluginManager.LoadAllPlugin()

    #遍历所有接入点下的所有插件
    for SingleModel in __ALLMODEL__:
        plugins = SingleModel.GetPluginObject()
        for item in plugins:

            #调用接入点的公共接口
            item.Start()

输出

I am plugin3 , I am a ParamPanel!

I am plugin2 , I am a ToolBar!

I am plugin1 , I am a menu!

I am plugin4 , I am a Component!

--结束END--

本文标题: Python搭建插件式框架(基于组件开发

本文链接: https://lsjlt.com/news/188015.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python搭建插件式框架(基于组件开发
    Python搭建插件式框架(基于组件开发) 概念 基于组件的开发(Component-Based Development,简称CBD)是一种软件开发范型。它是现今软件复用理论实用化的研究热点,在组件对象模型的支持下,通过复用已有...
    99+
    2023-01-31
    组件 插件 框架
  • 基于Python的Houdini插件开发过程详情
    本文以Python开发为例来进行说明,环境说明: (1) Python 3.x(我用的版本是 3.9 版本)(2)IDE开具 PyCharm(我用的版本是 PyCharm Commu...
    99+
    2024-04-02
  • SpringCloud Alibaba 基本开发框架搭建过程
    目录1、创建多Module工程1.1、创建父工程1.2、创建子module 选中父项目,右键,新建module2、使用Gti进行版本控制2.1、初始化本地仓库 打开项目路径,右键gi...
    99+
    2024-04-02
  • 基于python 的Pygame最小开发框架
    目录1.最小开发框架代码2.关键代码介绍sys和pygame模块初始化init()及设置屏幕大小、标题、颜色设置事件循环退出游戏1.最小开发框架代码 import sys  impo...
    99+
    2024-04-02
  • 基于Django框架的开源软件有哪些
    本篇内容介绍了“基于Django框架的开源软件有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!CMS 建站系统 Django-CmsDj...
    99+
    2023-06-17
  • 基于python的Pygame最小开发框架怎么用
    本篇内容主要讲解“基于python的Pygame最小开发框架怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于python的Pygame最小开发框架怎么用”吧!1.最小开发框架代码impo...
    99+
    2023-06-30
  • 基于IntelliJ IDEA/Android Studio插件开发指南(推荐)
    目录前言插件开发的基本流程1. 环境配置1.1 安装PDK1.2 配置插件开发SDK2. 新建插件工程3. Action4. 配置描述5. 调试、打包业务实践方案一:自建Diff工具...
    99+
    2024-04-02
  • 跨端开发框架avm组件如何封装
    本文小编为大家详细介绍“跨端开发框架avm组件如何封装”,内容详细,步骤清晰,细节处理妥当,希望这篇“跨端开发框架avm组件如何封装”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。引言avm.js 是一个跨端开发框...
    99+
    2023-07-02
  • Flutter框架中,组件间传值的基本方式
    构造函数传值 在创建widget时,可以通过构造函数将参数传递给子widget。例如: class ChildWidget extends StatelessWidget { final Strin...
    99+
    2023-09-14
    flutter
  • 基于NIO的网络编程框架Netty有哪些组件
    本篇内容介绍了“基于NIO的网络编程框架Netty有哪些组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Netty概述Netty是一个基于...
    99+
    2023-06-02
  • 如何在 Windows 上搭建 Python 文件框架环境?
    Python 是一种高级编程语言,广泛应用于各种领域,如数据分析、人工智能、机器学习等。在 Windows 操作系统上,搭建 Python 文件框架环境是一个非常基础的工作。本文将介绍如何在 Windows 上搭建 Python 文件框架环...
    99+
    2023-11-08
    文件 windows 框架
  • 基于Python实现从头搭建一个在线聊天室框架
    目录整体技术栈搭建权限框架构建前端页面今天从头开始做一个在线聊天网站,网上各种各样的聊天工具已经很多了,为啥还要做这么一个聊天工具呢,无他,兴趣耳! 今天先完成第一部分,搭建起聊天网...
    99+
    2022-11-16
    Python在线聊天室 Python 聊天室 Python 在线聊天 Python 聊天
  • 跨端开发框架avm组件封装经验分享
    目录引言1. 组件的定义和引用:1.1 使用stml定义一个组件 / 页面1.2 组件引用:2. 向子组件传值2.1 在其它页面使用子组件时传递静态值:2.2 通...
    99+
    2024-04-02
  • 选择支持组件化开发的灵活PHP框架
    symfony和laravel是支持组件化开发的灵活php框架:symfony: 提供广泛的组件,可根据需要集成,支持高度可定制化。laravel: 采用组件化架构,提供预构建模块,可用...
    99+
    2024-05-23
    php 组件化 laravel
  • Vue3 企业级组件库框架搭建 pnpm monorepo实战示例
    目录引言1 组件库工程应该具备的功能2 环境准备3 搭建 monorepo 项目3.1 创建项目3.2 配置 workspace引言 基于 vite3 vue3 的组件库基础工程&n...
    99+
    2022-11-13
    Vue3 组件库搭建pnpm monorepo Vue3 pnpm monorepo
  • 详解基于Vue cli开发修改外部组件Vant默认样式
    目录前言一、Less二、引入你的组件三、修改配置文件第一步:直接引入less文件第二步:修改样式变量总结前言 在引入外部组件的时候,想要修改默认样式,可以通过class修改,但一般会...
    99+
    2024-04-02
  • Python 基于Twisted框架的文件夹网络传输源码
    由于文件夹可能有多层目录,因此需要对其进行递归遍历。 本文采取了简单的协议定制,定义了五条命令,指令Head如下: Sync:标识开始同步文件夹 End:标识结束同步 File:标识传输的文件名(相对路径)...
    99+
    2022-06-04
    文件夹 源码 网络传输
  • Python 测试框架:掌握软件开发的关键
    单元测试入门 单元测试是验证代码各个组成部分(称为单元)正确性的过程。通过创建一系列测试用例,可以测试特定函数、类或模块的行为。测试用例是输入数据的集合,以及对预期输出的断言。 Python 测试框架概览 Python 拥有多种出色的测试...
    99+
    2024-04-02
  • Python 测试框架:软件开发的可靠伙伴
    测试框架的优势 自动化测试: 测试框架能够自动化测试用例的执行,减少手动测试的工作量,提高测试效率。 可维护性: 使用测试框架编写测试用例更具可维护性,当代码发生变化时,只需要更新受影响的测试用例。 覆盖率分析: 测试框架可以提供覆盖率...
    99+
    2024-04-02
  • Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
    OnceIO 是 OnceDoc 企业内容(网盘)的底层Web框架,它可以实现模板文件、静态文件的全缓存,运行起来完全不需要I/O操作,并且支持客户端缓存优化,GZIP压缩等(只在第一次压缩),拥有非常好的...
    99+
    2022-06-04
    文件上传 框架 功能
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作