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 相关文章推荐
在Django中限制已登录用户的访问的方法
Jul 23 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
Jan 15 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
Django用户身份验证完成示例代码
Apr 03 Python
Python PIL库图片灰化处理
Apr 07 Python
Python之变量类型和if判断方式
May 05 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 Python
Python实现简单猜数字游戏
Feb 03 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
第二节 对象模型 [2]
2006/10/09 PHP
PHP读写文件的方法(生成HTML)
2006/11/27 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
webpack3之loader全解析
2017/10/26 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
React组件对子组件children进行加强的方法
2019/06/23 Javascript
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
python实现贪吃蛇游戏
2020/03/21 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
你懂得怎么写自荐信吗?
2013/12/27 职场文书
少先队入队活动方案
2014/02/08 职场文书
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android