Python实现动态添加类的属性或成员函数的解决方法


Posted in Python onJuly 16, 2014

某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法。用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块。

本文就此简述了Python实现动态添加类的属性或成员函数的解决方法,具体方法如下:

首先我们可以参考ulipad的实现:mixin。

这里做的比较简单,只是声明一个类,类初始化的时候读取配置文件,根据配置列表加载特定目录下的模块下的函数,函数和模块同名,将此函数动态加载为类的成员函数。

代码如下所示:

class WinBAS(Bas):
  def __init__(self):
    self.__baslist = {}
    self.__Init_Modules()
    pass
  def __Init_Modules(self):
    import modplugs
    for m in modplugs.__moduleset__:
      mh = __import__('modules.' + m)# + '.' + m)
      ma = getattr(mh, m)# + '.' + m)
      ma = getattr(ma, m)
      setattr(self.__class__, m, ma)

modplugs.py是模块配置文件如下:

__moduleset__ = [
'BAS_GetUserList',
]

然后建立目录modules下面建立一个空的__init__.py文件,把目录变为一个包,在modules目录下建立真正的BAS_GetUserList实现:BAS_GetUserList文件中有个BAS_GetUserList函数如下:

def BAS_GetUserList(self, strs):
  return [0, strs]

这样WinBAS类就可以动态加入了BAS_GetUserList函数。

Python 相关文章推荐
让Python代码更快运行的5种方法
Jun 21 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 Python
Python3日期与时间戳转换的几种方法详解
Jun 04 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
Jun 28 Python
通过实例解析python描述符原理作用
Jan 22 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 Python
Python重新引入被覆盖的自带function
Jul 16 #Python
Python实现扫描指定目录下的子目录及文件的方法
Jul 16 #Python
python re正则表达式模块(Regular Expression)
Jul 16 #Python
Web服务器框架 Tornado简介
Jul 16 #Python
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 #Python
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 #Python
python django集成cas验证系统
Jul 14 #Python
You might like
PHP 图片水印类代码
2012/08/27 PHP
PHP迭代器的内部执行过程详解
2013/11/12 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
JavaScript 特殊字符
2007/04/05 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
python使用urlparse分析网址中域名的方法
2015/04/15 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
python实现事件驱动
2018/11/21 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
波兰购物网站:MALL.PL
2019/05/01 全球购物
法人授权委托书范本
2014/04/04 职场文书
幼师求职自荐信
2014/05/31 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技