广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中动态创建类实例的方法
  • 150
分享到

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

实例方法动态 2022-06-04 18:06:38 150人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

简介

在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中动态创建类实例的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程网网站的支持!

--结束END--

本文标题: Python中动态创建类实例的方法

本文链接: https://www.lsjlt.com/news/13527.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python中动态创建类实例的方法
    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如...
    99+
    2022-06-04
    实例 方法 动态
  • Python中动态创建类实例
    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下: def crea...
    99+
    2023-01-31
    实例 动态 Python
  • Java 创建动态类和查看方法列表信息的实例
     Java 创建动态类和查看方法列表信息的实例Sample code :import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandle...
    99+
    2023-05-31
    java 动态类 ava
  • Python类的动态修改的实例方法
    Python类的动态修改的实例方法 相信很多朋友在编程的时候都会想修改一下已经写好的程序行为代码,而最常见的方式就是通过子类来重写父类的一些不满足需求的方法。比如说下面这个例子。 class Dog: ...
    99+
    2022-06-04
    实例 方法 动态
  • 怎么在python中动态创建类
    这篇文章将为大家详细讲解有关怎么在python中动态创建类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3...
    99+
    2023-06-14
  • Python中的实例方法、类方法、静态方法的区别
    一、参数的区别 实例方法:实例方法的名列前茅个参数总是实例对象self,它是类实例的一个引用。 类方法:类方法的名列前茅个参数总是类对象cls,它表示该方法属于类而非实例。 静态方法:静态方法没有特定的名列前茅个参...
    99+
    2023-10-29
    方法 静态 实例
  • 浅谈python中的实例方法、类方法和静态方法
    在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做限制,可以是self,也可以是cls,不过根据人们的惯用用法,sel...
    99+
    2022-06-04
    方法 浅谈 静态
  • python创建堆的方法实例讲解
    1、说明 创建堆有两种基本方法:heappush() 和 heapify()。 当使用heappush()时,当新元素添加时,堆得顺序被保持了。 如果数据已经在内存中,则使用 hea...
    99+
    2022-11-11
  • JavaScript中创建动态QML对象的方法
    一、动态创建对象 有两种方法可以从 JavaScript 动态创建对象: 调用 Qt.createComponent() 动态创建 Component 对象 使用...
    99+
    2022-11-12
  • 在python中创建表格的两种方法实例
    目录日常拉呱:创建表格一般有两种方法:一:通过导入xlwt创建二:通过导入csv库来创建1.写入数据2.读取数据总结日常拉呱: 最近在学习爬虫模拟登陆各个软件,老师留有作业,模拟登录...
    99+
    2022-11-13
  • nodejs动态创建二维码的方法
    本文实例为大家分享了nodejs动态创建二维码的具体代码,供大家参考,具体内容如下 <!--弹出二维码--> <div class="qrcode"> <div>...
    99+
    2022-06-04
    方法 动态 二维码
  • python实例方法、静态方法与类方法源码分析
    本篇内容介绍了“python实例方法、静态方法与类方法源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2022-10-19
  • python中动态加载模块和类方法实现
    python中动态加载模块和类方法实现测试代码   文件名: mytest.py 具体代码如下:   注意:模块名,类名,方法名都是变量。   #coding=UTF-8 class TestClass: def sub(se...
    99+
    2023-01-31
    模块 加载 方法
  • es6中class类静态方法,静态属性,实例属性,实例方法的示例分析
    这篇文章主要为大家展示了“es6中class类静态方法,静态属性,实例属性,实例方法的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“es6中class类...
    99+
    2022-10-19
  • python创建与遍历二叉树的方法实例
    前言 树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构;在计算机领域中也有广泛...
    99+
    2022-11-12
  • MySql创建分区的方法实例
    目录一、Mysql分区类型二、RANGE分区二、Hash分区三、Key分区四、List分区附:查询分区,各区表数据量总结友情链接一、Mysql分区类型 1、RANGE 分区:基于属于...
    99+
    2022-11-13
  • C#实现动态创建接口并调用的实例
    本文简单介绍如何动态创建接口interface的实现实例对象,包含两个知识点: 1.如何获取接口interface的所有实现实例对象? 2.如何判断实例对象的构造函...
    99+
    2022-11-12
  • linux静态库和动态库的创建与使用方法
    这篇文章主要介绍“linux静态库和动态库的创建与使用方法”,在日常操作中,相信很多人在linux静态库和动态库的创建与使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux静态库和动态库的创建与使...
    99+
    2023-06-13
  • Android中new Notification创建实例的最佳方法
    目前 Android 已经不推荐使用下列方式创建 Notification实例: Notification notification = new Notification(...
    99+
    2022-06-06
    new 方法 notification Android
  • vue+el-element中根据文件名动态创建dialog的方法实践
    目录背景实现1.封装的/utils/dialogControl.js2.dialog文件定义 3.使用背景 在项目中使用对话框的通常做法是把对话框封装成组件,在使用的地方引入,然后...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作