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中的ConfigParser模块使用详解
May 04 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
python简单实现操作Mysql数据库
Jan 29 Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 Python
python批量查询、汉字去重处理CSV文件
May 31 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
Jul 14 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
Dec 01 Python
django学习之ajax post传参的2种格式实例
May 14 Python
Django REST framework 限流功能的使用
Jun 24 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中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
日期 时间js控件
2009/05/07 Javascript
jquery 插件开发备注
2010/08/27 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python实现的jpg格式图片修复代码
2015/04/21 Python
python计算一个序列的平均值的方法
2015/07/11 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
python表格存取的方法
2018/03/07 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
Series和DataFrame使用简单入门
2019/11/13 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
python文件及目录操作代码汇总
2020/07/08 Python
Python字节单位转换(将字节转换为K M G T)
2021/03/02 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
开会迟到检讨书
2014/01/08 职场文书
我的长生果教学反思
2014/04/28 职场文书
文明寝室申报材料
2014/05/12 职场文书
2014年妇女工作总结
2014/12/06 职场文书
公务员政审个人总结
2015/02/12 职场文书
食堂卫生管理制度
2015/08/04 职场文书