欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中動態(tài)創(chuàng)建類實例的方法

 更新時間:2017年03月24日 10:44:28   投稿:mrr  
在Java中我們可以通過反射來根據(jù)類名創(chuàng)建類實例,那么在Python我們怎么實現(xiàn)類似功能呢?其實在Python有一個builtin函數(shù)import,我們可以使用這個函數(shù)來在運行時動態(tài)加載一些模塊

簡介

在Java中我們可以通過反射來根據(jù)類名創(chuàng)建類實例,那么在Python我們怎么實現(xiàn)類似功能呢?

其實在Python有一個builtin函數(shù)import,我們可以使用這個函數(shù)來在運行時動態(tài)加載一些模塊。如下:

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打包的應(yīng)用程序,如果使用上面的代碼,運行打包后的程序會出現(xiàn)下面的錯誤

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

解決辦法三:

動態(tài)修改 python 運行時path,見下面代碼中的前兩行,其中path我們可以通過環(huán)境變量或者參數(shù)傳遞進來。顯然這種方法要比前兩種方法靈活的多。

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中動態(tài)創(chuàng)建類實例的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Pandas標記刪除重復記錄的方法

    Pandas標記刪除重復記錄的方法

    下面小編就為大家分享一篇Pandas標記刪除重復記錄的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 使用tensorflow實現(xiàn)AlexNet

    使用tensorflow實現(xiàn)AlexNet

    這篇文章主要為大家詳細介紹了使用tensorflow實現(xiàn)AlexNet,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • python使用PyQt5的簡單方法

    python使用PyQt5的簡單方法

    這篇文章主要介紹了python使用PyQt5的簡單方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • python 簡單照相機調(diào)用系統(tǒng)攝像頭實現(xiàn)方法 pygame

    python 簡單照相機調(diào)用系統(tǒng)攝像頭實現(xiàn)方法 pygame

    今天小編就為大家分享一篇python 簡單照相機調(diào)用系統(tǒng)攝像頭實現(xiàn)方法 pygame,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Pytorch加載數(shù)據(jù)集的方式總結(jié)及補充

    Pytorch加載數(shù)據(jù)集的方式總結(jié)及補充

    Pytorch自定義數(shù)據(jù)集方法,應(yīng)該是用pytorch做算法的最基本的東西,下面這篇文章主要給大家介紹了關(guān)于Pytorch加載數(shù)據(jù)集的方式總結(jié)及補充,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • python中的全局變量用法分析

    python中的全局變量用法分析

    這篇文章主要介紹了python中的全局變量用法,詳細分析了Python全局變量使用中的利弊與相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • Python?find()、rfind()方法及作用

    Python?find()、rfind()方法及作用

    這篇文章主要介紹了Python?find()、rfind()方法,find方法的作用檢索是否指定的字符串,如果存在返回首次出現(xiàn)該字符串的索引,如果不存在返回-1,rfind 方法的作用和find方法作用相同,本文結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • python3實現(xiàn)用turtle模塊畫一棵隨機櫻花樹

    python3實現(xiàn)用turtle模塊畫一棵隨機櫻花樹

    今天小編就為大家分享一篇python3實現(xiàn)用turtle模塊畫一棵隨機櫻花樹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python 讀取WAV音頻文件 畫頻譜的實例

    Python 讀取WAV音頻文件 畫頻譜的實例

    這篇文章主要介紹了Python 讀取WAV音頻文件 畫頻譜的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 解決Jupyter因卸載重裝導致的問題修復

    解決Jupyter因卸載重裝導致的問題修復

    這篇文章主要介紹了解決Jupyter因卸載重裝導致的問題修復,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論