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 requests 使用快速入门
Aug 31 Python
Python中用post、get方式提交数据的方法示例
Sep 22 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
Python无损音乐搜索引擎实现代码
Feb 02 Python
使用Python更换外网IP的方法
Jul 09 Python
python解析json串与正则匹配对比方法
Dec 20 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
Jul 25 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
Python装饰器结合递归原理解析
Jul 02 Python
python 实现学生信息管理系统的示例
Nov 28 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
基于mysql的bbs设计(一)
2006/10/09 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
python中管道用法入门实例
2015/06/04 Python
浅谈python3中input输入的使用
2019/08/02 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
python实现的Iou与Giou代码
2020/01/18 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
python中selenium库的基本使用详解
2020/07/31 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
How to spawning asynchronous work in J2EE
2016/08/29 面试题
大学生职业生涯规划范文
2013/12/31 职场文书
公司周年庆寄语
2019/06/21 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
使用feign服务调用添加Header参数
2021/06/23 Java/Android
openstack中的rpc远程调用的方法
2021/07/09 Python
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs