国产探花免费观看_亚洲丰满少妇自慰呻吟_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            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 遵化市| 奉新县| 武胜县| 惠安县| 万盛区| 惠水县| 荔波县| 屯留县| 仁怀市| 邓州市| 四平市| 遵义市| 兴安县| 肇源县| 南陵县| 克什克腾旗| 灵武市| 偏关县| 台北市| 仙桃市| 准格尔旗| 手游| 尉氏县| 葫芦岛市| 工布江达县| 盈江县| 通河县| 莱芜市| 屏东市| 吉林省| 望奎县| 准格尔旗| 太谷县| 高雄县| 武胜县| 柳江县| 张家港市| 冕宁县| 江川县| 新兴县| 永福县|