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 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
在Python中使用正则表达式的方法
Aug 13 Python
简单了解Python下用于监视文件系统的pyinotify包
Nov 13 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
详解numpy的argmax的具体使用
May 27 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
python 修改本地网络配置的方法
Aug 14 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
Apr 26 Python
python为什么会环境变量设置不成功
Jun 23 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中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
javascript天然的迭代器
2010/10/29 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
javascript操作数组详解
2014/12/17 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
2018/01/03 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
Python+django实现文件上传
2016/01/17 Python
python生成随机图形验证码详解
2017/11/08 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
Python 监测文件是否更新的方法
2019/06/10 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
Python接收手机短信的代码整理
2020/08/02 Python
详解Python 函数参数的拆解
2020/09/02 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
校班主任推荐信范文
2013/12/03 职场文书
2014年采购部工作总结
2014/11/20 职场文书
品质保证书格式
2015/02/28 职场文书
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python