Python中动态创建类实例的方法
作者:mrr 发布时间:2023-07-20 02:36:44
标签:python,动态,类实例
简介
在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中动态创建类实例的方法网站的支持!
0
投稿
猜你喜欢
- 前言:这个先来创建一个模块,名称为christmastree,在该模块中,首先定义一个全局变量,然后创建一个名称为fun_christmas
- 使用正则库爬取淘宝商品的商品信息,首先我们需要确定想要爬取的对象我们在淘宝里搜索“python”,出来的结果从url连接中可以得到搜索商品的
- 认识模块对于模块,在前面的一些举例中,已经涉及到了,比如曾经有过:import random (获取随机数模块)。为了能够对模块有一个清晰的
- 绘制动图FuncAnimation,它的使用要求简洁且定制化程度较高。如果想将很多图片合并为一个动图,那么ArtistAnimation是最
- 防止一般的采集以及小偷读取,加在顶部。同理,可以改造成JS脚本。下面的方法是通过选择同一IP的访问频率来达到防止采集的目的,就是可能也把搜索
- 为什么要使用php缓存技术?理由很简单:提高效率。在程序开发中,获取信息的方式主要是查询数据库,除此以外,也可能是通过Web Service
- 最近公司有一个日文项目,由于之前使用的是自己开发的中文CMS,并没有将语言包分离,在网站建设调试过程中出现了令人头疼的乱码问题。乱码出现的原
- Oracle的执行计划一句话命令:set autotrace on
- 本文实例讲述了php基于websocket搭建简易聊天室实践。分享给大家供大家参考。具体如下:1、前言公司游戏里面有个简单的聊天室,了解了之
- 本文实例为大家分享了python实现录音功能的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-import
- 最近 W3C 一口气推出 7 个 HTML 工作草案,涵盖了 HTML5,HTML RDF,HTML Microdata,HTM
- 一、停止线程利用Threading库我们可以很方便地创建线程,让它按照我们的想法执行我们想让它执行的事情,从而加快程序运行的效率。然而有一点
- 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1、如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
- 1. 复制表结构及其数据:create table table_name_new as select * from table_name_o
- 前面简单介绍了Python基本运算,这里再来简单讲述一下Python字符串相关操作1. 字符串表示方法>>> "
- 这篇文章主要介绍了python3下pygame如何实现显示中文,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 一、进程之间的数据共享展望未来,基于消息传递的并发编程是大势所趋即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换
- 如果你的网站涉及个人隐私或者机密性非公开的网页,怎样告诉禁止搜索引擎收录抓取,下面侯庆龙说下以下方法,希望对不想被搜索引擎收录抓取网站有所帮
- python 3.10支持match语句,3,10以下不支持。match语句接受一个表达式,并将其值与作为一个或多个case块给出的连续模式
- 这里的等价不是说function的toString相同,也不是说function的引用相同,而是说对于两个function A和B,如果它们