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中的魔法方法深入理解
Jul 09 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
简介Python中用于处理字符串的center()方法
May 18 Python
python实现批量解析邮件并下载附件
Jun 19 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
python递归全排列实现方法
Aug 18 Python
对Python 内建函数和保留字详解
Oct 15 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
python获取Linux发行版名称
Aug 30 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
Python实现随机爬山算法
Jan 29 Python
matplotlib阶梯图的实现(step())
Mar 02 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
php控制文件下载速度的方法
2015/03/24 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
bootstrap警告框示例代码分享
2017/05/17 Javascript
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
jquery.pager.js分页实现详解
2019/07/29 jQuery
axios实现简单文件上传功能
2019/09/25 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
python实现上传下载文件功能
2020/11/19 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
学校工作推荐信范文
2014/07/11 职场文书
护士个人年终总结
2015/02/13 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
Sql Server之数据类型详解
2022/02/28 SQL Server
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers