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抓取京东商城手机列表url实例代码
Dec 18 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
python中多层嵌套列表的拆分方法
Jul 02 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
利用Python代码实现一键抠背景功能
Dec 29 Python
python实现单张图像拼接与批量图片拼接
Mar 23 Python
Python json转字典字符方法实例解析
Apr 13 Python
Python如何实现定时器功能
May 28 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
只用Python就可以制作的简单词云
Jun 07 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 strncasecmp字符串比较的小技巧
2011/01/04 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
php树型类实例
2014/12/05 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
2016/08/01 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
python3序列化与反序列化用法实例
2015/05/26 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
基于html5 canvas做批改作业的小插件
2020/05/20 HTML / CSS
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
儿科护士实习自我鉴定
2013/10/17 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS