我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python中动态创建类实例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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()

转载请以链接形式标明本文链接
本文链接:http://blog.csdn.net/kongxx/article/details/65626418

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python中动态创建类实例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中动态创建类实例

简介在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢?其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下:def createInstanc
2023-01-31

Python中动态创建类实例的方法

简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下:def createInsta
2022-06-04

怎么在python中动态创建类

这篇文章将为大家详细讲解有关怎么在python中动态创建类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3
2023-06-14

Java 创建动态类和查看方法列表信息的实例

Java 创建动态类和查看方法列表信息的实例Sample code :import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; im
2023-05-31

Python使用Matplotlib实现创建动态图形

Python使用Matplotlib创建动态图形是一项强大的功能,可以交互式地探索数据。通过导入Matplotlib库并遵循步骤,您可以创建和自定义动态图形。Matplotlib提供了交互功能,如缩放、平移和旋转,以及添加注释的能力。动态图形的优点包括交互性、可定制性和开源。它们广泛应用于数据可视化、科学计算、金融分析以及教育和研究领域。
Python使用Matplotlib实现创建动态图形
2024-04-02

Python类的动态修改的实例方法

Python类的动态修改的实例方法 相信很多朋友在编程的时候都会想修改一下已经写好的程序行为代码,而最常见的方式就是通过子类来重写父类的一些不满足需求的方法。比如说下面这个例子。class Dog:def bark(self):print
2022-06-04

MFC中动态创建DECLARE_DYNCREATE和运行时类型识别DECLARE

在MFC(Microsoft Foundation Classes)中,DECLARE_DYNCREATE和运行时类型识别(DECLARE_RUNTIME_CLASS)是用于支持动态创建和运行时类型识别的宏。1. DECLARE_DYNCR
2023-10-12

MySQL中如何创建动态报表

在MySQL中创建动态报表,一种常见的方法是通过存储过程和动态SQL语句来实现。以下是一个简单的示例:创建存储过程:DELIMITER //CREATE PROCEDURE create_dynamic_report()BEGINDECL
MySQL中如何创建动态报表
2024-04-30

Oracle中如何动态创建变量

在Oracle数据库中,可以使用PL/SQL(Procedural Language/SQL)来动态创建变量。PL/SQL是一种过程式语言,它允许你编写更复杂的程序,如存储过程、函数和触发器等。在PL/SQL中,可以使用DECLARE语句块
Oracle中如何动态创建变量
2024-08-28

在 PHP 中创建和使用静态类

在 PHP 中,静态类是在程序中只实例化一次的类。它必须有一个静态成员(variable)、静态成员函数(method),或两者兼有。在 PHP 中使用静态变量创建静态类让我们创建一个类并初始化四个变量。然后我们将使用类名访问它们。
在 PHP 中创建和使用静态类
2024-02-27

jQuery如何实现动态创建元素?

jQuery动态创建元素jQuery提供了动态创建元素的能力,用于丰富用户交互和创建动态页面。通过$()函数创建新元素,并使用append()添加到DOM。可设置属性、样式和事件处理程序。动态创建元素的好处包括动态页面、简化的DOM操作、代码可重用性、动画和过渡,以及避免直接操作DOM。
jQuery如何实现动态创建元素?
2024-04-08

Spring Boot如何动态创建Bean示例代码

前言本文主要给大家介绍了关于Spring Boot动态创建Bean的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。SpringBoot测试版本:1.3.4.RELEASE参考代码如下:package com.sp
2023-05-31

Android Fragment动态创建详解及示例代码

Android Fragment 动态创建 Fragment是activity的界面中的一部分或一种行为。可以把多个Fragment组合到一个activity中来创建一个多界面并且可以在多个activity中重用一个Fragment。可以把
2022-06-06

rabbitmq动态创建队列怎么实现

RabbitMQ提供了一种动态创建队列的方式,可以通过以下步骤实现:配置RabbitMQ服务器:确保RabbitMQ服务器已正确安装和配置。创建一个连接:使用RabbitMQ的客户端库,如pika(Python)或amqplib(Java
2023-10-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录