Python中动态创建类实例的方法


Posted in Python onMarch 24, 2017

简介

在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢?

其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下:

def createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
  return obj

例子

首先我们建一个目录 my_modules,其中包括三个文件

* init.py: 模块文件
* my_module.py: 测试用的模块
* my_another_module: 另一个测试用的模块

my_module.py

from my_modules.my_another_module import *
class MyObject(object):
  def test(self):
    print 'MyObject.test'
    MyObject1().test()
    MyObject2().test()
    MyAnotherObject().test()
class MyObject1(object):
  def test(self):
    print 'MyObject1.test'
class MyObject2(object):
  def test(self):
    print 'MyObject2.test'

my_another_module.py

class MyAnotherObject(object):
  def test(self):
    print 'MyAnotherObject.test'

test.py

def createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
  return obj
obj = createInstance("my_modules.my_module", "MyObject")
obj.test()
MyObject.test
MyObject1.test
MyObject2.test
MyAnotherObject.test

pyinstaller集成

对于使用pyinstaller打包的应用程序,如果使用上面的代码,运行打包后的程序会出现下面的错误

Traceback (most recent call last):
 File "test.py", line 12, in <module>
  obj = createInstance("my_modules.my_module", "MyObject")
 File "test.py", line 7, in createInstance
  module_meta = __import__(module_name, globals(), locals(), [class_name])
ImportError: No module named my_modules.my_module
Failed to execute script test

这里错误的原因是 pyinstaller 在打包分析类的时候没有分析到 my_modules 下面的模块,所以运行报错。

解决办法一:

在 test.py 中把 my_modules 下的模块手动 import,见下面代码中的第一行。这种方法最简单,但是显然不太好。

import my_modules.my_module
def createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
  return obj
obj = createInstance("my_modules.my_module", "MyObject")
obj.test()

解决办法二:

在使用 pyinstaller 打包的时候,指定 “?hidden-import”,如下

pyinstaller -D --hidden-import my_modules.my_module test.py

解决办法三:

动态修改 python 运行时path,见下面代码中的前两行,其中path我们可以通过环境变量或者参数传递进来。显然这种方法要比前两种方法灵活的多。

import sys
sys.path.append(...)
def createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
  return obj
obj = createInstance("my_modules.my_module", "MyObject")
obj.test()

以上所述是小编给大家介绍的Python中动态创建类实例的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python插入排序算法的实现代码
Nov 21 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
利用python循环创建多个文件的方法
Oct 25 Python
Django REST framework 分页的实现代码
Jun 19 Python
python2爬取百度贴吧指定关键字和图片代码实例
Aug 14 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 Python
python3中set(集合)的语法总结分享
Mar 24 #Python
Python Socket编程详细介绍
Mar 23 #Python
python3中int(整型)的使用教程
Mar 23 #Python
python利用Guetzli批量压缩图片
Mar 23 #Python
python3中str(字符串)的使用教程
Mar 23 #Python
python常用知识梳理(必看篇)
Mar 23 #Python
Python爬取qq music中的音乐url及批量下载
Mar 23 #Python
You might like
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php获得url参数中具有&amp;的值的方法
2014/03/05 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
php常用图片处理类
2016/03/16 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
JSON相关知识汇总
2015/07/03 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
[42:00]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第一场 12.13
2020/12/17 DOTA
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
django2笔记之路由path语法的实现
2019/07/17 Python
django ajax发送post请求的两种方法
2020/01/05 Python
《泉水》教学反思
2014/04/11 职场文书
党员承诺书格式
2014/05/21 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python