简介

在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中动态创建类实例的方法相关推荐

  1. excel调用python编程-使用Python和xlwt向Excel文件中写入中文的实例

    sheet1.write(row_num,0,f) row_num = 1 book.save('demo.xls') 程序执行结果如下: grey@DESKTOP-3T80NPQ:/mnt/e/01 ...

  2. python time库_python中time库的实例使用方法

    python中time库的实例使用方法 time是python中处理时间的标准库 计算机时间的表达 提供获取系统时间并格式化输出功能 提供系统级精确计时功能,用于程序性能分析 用法:import ti ...

  3. MFC中动态创建控件以及事件响应实现方法

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

  4. MFC中动态创建控件以及添加事件响应

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

  5. WPF 中动态创建和删除控件

    WPF 中动态创建和删除控件 原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件 ...

  6. Java如何配置ibmmq集群_如何在IBM MQ集群中动态创建订阅?

    当我使用此代码作为订阅者时: class Product(model.Models): def saveProduct(self, product): if self.validateProduct( ...

  7. MFC中动态创建button及添加响应事件

    MFC中动态创建button及添加响应的事件,主要步骤如下:  1.在头文件(**Dlg.h)中添加一个CButton类型,  例如:CButton btn;  2.在(**Dlg.cpp)的OnIn ...

  8. python画50个图-python 实现在一张图中绘制一个小的子图方法

    有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...

  9. python画简便的图-python 实现在一张图中绘制一个小的子图方法

    有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...

最新文章

  1. python能解密java的,在python中解码Java对象
  2. android 中使用AsyncTask实现简单的异步编程
  3. 博客No.1活动暂停公告
  4. Python自动化--语言基础5--面向对象、迭代器、range和切片的区分
  5. 【转】MyEclipse快捷键大全(绝对全)
  6. Linux异常进程kill无效的解决办法
  7. 使用 Eclipse 平台进行调试
  8. 线性表的顺序存储结构和链式存储结构的比较
  9. 智能小车52单片机c语言,基于STC89C52单片机的智能循迹小车设计
  10. adb 查看固件版本
  11. 长尾理论 推荐系统长尾理论
  12. 基于HL7的HIE平台
  13. Geoserver2.11矢量切片与OL3中的调用展示
  14. SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用
  15. 笔记本服务器连接显示器不亮,笔记本开机显示器不亮怎么办
  16. 企业发放的奖金根据利润提成问题
  17. 如何学好C++语言—酷壳
  18. ChatGPT初体验-帮我写一本奇幻冒险小说(Aethia的勇士)
  19. linux .gz文件 解压缩命令的简单使用
  20. Hadoop-HA集群启动后两个namenode都是standby问题。

热门文章

  1. 用python快速画小猪佩奇
  2. A100 GPU硬件架构
  3. 深度学习模型训练过程
  4. Java 修饰符的总结
  5. java list 常见的使用方法
  6. intent传递有没有大小限制,是多少?
  7. JAVA中获取当前系统时间
  8. android 读取asset下的文件注意事项
  9. jboss_log4j.xml配置
  10. Linux 忘记登录密码?破解系统登陆密码