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中的is和id用法分析
Jan 26 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
Python学生信息管理系统修改版
Mar 13 Python
点球小游戏python脚本
May 22 Python
python2.7和NLTK安装详细教程
Sep 19 Python
利用python将图片版PDF转文字版PDF
May 03 Python
Python实现制度转换(货币,温度,长度)
Jul 14 Python
Python API len函数操作过程解析
Mar 05 Python
Python实现像awk一样分割字符串
Sep 15 Python
Python提取视频中图片的示例(按帧、按秒)
Oct 22 Python
Flask中jinja2的继承实现方法及实例
Mar 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
Laravel 实现密码重置功能
2018/02/23 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
angular2使用简单介绍
2016/03/01 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python基础教程之字典操作详解
2014/03/25 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
python调用API实现智能回复机器人
2018/04/10 Python
python读取LMDB中图像的方法
2018/07/02 Python
python中的decimal类型转换实例详解
2019/06/26 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
如何在 Django 模板中输出 &quot;{{&quot;
2020/01/24 Python
python中for in的用法详解
2020/04/17 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
求职毕业生自荐书
2014/02/08 职场文书
个人委托书
2014/07/31 职场文书
高中教师个人总结
2015/02/10 职场文书
2015年毕业生自荐信范文
2015/03/24 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
详解Vue的sync修饰符
2021/05/15 Vue.js