python创建类的实例方法-Python中动态创建类实例的方法
简介
在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢?
其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下:
1
2
3
4
5
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
1
2
3
4
5
6
7
8
9
10
11
12
13
from my_modules.my_another_moduleimport *
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
1
2
3
class MyAnotherObject(object):
def test(self):
print "MyAnotherObject.test"
test.py
1
2
3
4
5
6
7
8
9
10
11
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打包的应用程序,如果使用上面的代码,运行打包后的程序会出现下面的错误
1
2
3
4
5
6
7
Traceback (most recent call last):
File "test.py", line12,in
obj= createInstance("my_modules.my_module","MyObject")
File "test.py", line7,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,见下面代码中的第一行。这种方法最简单,但是显然不太好。
1
2
3
4
5
6
7
8
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”,如下
1
pyinstaller-D--hidden-import my_modules.my_module test.py
解决办法三:
动态修改 python 运行时path,见下面代码中的前两行,其中path我们可以通过环境变量或者参数传递进来。显然这种方法要比前两种方法灵活的多。
1
2
3
4
5
6
7
8
9
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中动态创建类实例的方法相关推荐
- excel调用python编程-使用Python和xlwt向Excel文件中写入中文的实例
sheet1.write(row_num,0,f) row_num = 1 book.save('demo.xls') 程序执行结果如下: grey@DESKTOP-3T80NPQ:/mnt/e/01 ...
- python time库_python中time库的实例使用方法
python中time库的实例使用方法 time是python中处理时间的标准库 计算机时间的表达 提供获取系统时间并格式化输出功能 提供系统级精确计时功能,用于程序性能分析 用法:import ti ...
- MFC中动态创建控件以及事件响应实现方法
本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...
- MFC中动态创建控件以及添加事件响应
本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...
- WPF 中动态创建和删除控件
WPF 中动态创建和删除控件 原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件 ...
- Java如何配置ibmmq集群_如何在IBM MQ集群中动态创建订阅?
当我使用此代码作为订阅者时: class Product(model.Models): def saveProduct(self, product): if self.validateProduct( ...
- MFC中动态创建button及添加响应事件
MFC中动态创建button及添加响应的事件,主要步骤如下: 1.在头文件(**Dlg.h)中添加一个CButton类型, 例如:CButton btn; 2.在(**Dlg.cpp)的OnIn ...
- python画50个图-python 实现在一张图中绘制一个小的子图方法
有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...
- python画简便的图-python 实现在一张图中绘制一个小的子图方法
有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...
最新文章
- python能解密java的,在python中解码Java对象
- android 中使用AsyncTask实现简单的异步编程
- 博客No.1活动暂停公告
- Python自动化--语言基础5--面向对象、迭代器、range和切片的区分
- 【转】MyEclipse快捷键大全(绝对全)
- Linux异常进程kill无效的解决办法
- 使用 Eclipse 平台进行调试
- 线性表的顺序存储结构和链式存储结构的比较
- 智能小车52单片机c语言,基于STC89C52单片机的智能循迹小车设计
- adb 查看固件版本
- 长尾理论 推荐系统长尾理论
- 基于HL7的HIE平台
- Geoserver2.11矢量切片与OL3中的调用展示
- SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用
- 笔记本服务器连接显示器不亮,笔记本开机显示器不亮怎么办
- 企业发放的奖金根据利润提成问题
- 如何学好C++语言—酷壳
- ChatGPT初体验-帮我写一本奇幻冒险小说(Aethia的勇士)
- linux .gz文件 解压缩命令的简单使用
- Hadoop-HA集群启动后两个namenode都是standby问题。