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 执行字符串表达式函数(eval exec execfile)
Aug 11 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 Python
python控制nao机器人身体动作实例详解
Apr 29 Python
django drf框架自带的路由及最简化的视图
Sep 10 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 Python
Java如何基于wsimport调用wcf接口
Jun 17 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
yii框架配置默认controller和action示例
2014/04/30 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
python实现处理mysql结果输出方式
2020/04/09 Python
基于python 凸包问题的解决
2020/04/16 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
法务专员岗位职责
2014/01/02 职场文书
记帐员岗位责任制
2014/02/08 职场文书
家长学校工作方案
2014/05/07 职场文书
五一劳动节慰问信
2015/02/14 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS
TensorFlow的自动求导原理分析
2021/05/26 Python
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL
virtualenv隔离Python环境的问题解析
2022/06/21 Python
Nginx跨域问题解析与解决
2022/08/05 Servers