国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中動態創建類實例的方法

2020-02-23 04:28:28
字體:
來源:轉載
供稿:網友

簡介

在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 objobj = createInstance("my_modules.my_module", "MyObject")obj.test()MyObject.testMyObject1.testMyObject2.testMyAnotherObject.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_moduleFailed to execute script test

這里錯誤的原因是 pyinstaller 在打包分析類的時候沒有分析到 my_modules 下面的模塊,所以運行報錯。

解決辦法一:

在 test.py 中把 my_modules 下的模塊手動 import,見下面代碼中的第一行。這種方法最簡單,但是顯然不太好。

import my_modules.my_moduledef 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 objobj = createInstance("my_modules.my_module", "MyObject")obj.test()

解決辦法二:

在使用 pyinstaller 打包的時候,指定 “–hidden-import”,如下

pyinstaller -D --hidden-import my_modules.my_module test.py            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴安县| 辽中县| 婺源县| 鸡泽县| 和静县| 宁阳县| 荥阳市| 彭州市| 萨迦县| 拉孜县| 昌乐县| 宁德市| 北票市| 焉耆| 阳新县| 涪陵区| 宝丰县| 乡宁县| 连平县| 黑龙江省| 明光市| 南涧| 白山市| 浦县| 易门县| 临猗县| 巴林右旗| 噶尔县| 全州县| 遂昌县| 景德镇市| 孝义市| 安陆市| 绥棱县| 临夏市| 南昌县| 金湖县| 驻马店市| 天等县| 八宿县| 渝中区|