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发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 Python
Python读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
Python中关于使用模块的基础知识
May 24 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
详解如何用python实现一个简单下载器的服务端和客户端
Oct 28 Python
pytorch进行上采样的种类实例
Feb 18 Python
python 画条形图(柱状图)实例
Apr 24 Python
Python如何根据时间序列数据作图
May 12 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 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实现随机显示图片方法汇总
2015/05/21 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
js实现文字滚动效果
2016/03/03 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
python sys模块sys.path使用方法示例
2013/12/04 Python
Python字符串处理实例详解
2017/05/18 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
工作中个人的自我评价
2013/12/31 职场文书
美德好少年主要事迹
2014/01/29 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
手把手教你导入Go语言第三方库
2021/08/04 Golang