亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

簡(jiǎn)介

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

其實(shí)在Python有一個(gè)builtin函數(shù)import,我們可以使用這個(gè)函數(shù)來在運(yùn)行時(shí)動(dòng)態(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

例子

首先我們建一個(gè)目錄 my_modules,其中包括三個(gè)文件

* init.py: 模塊文件
* my_module.py: 測(cè)試用的模塊
* my_another_module: 另一個(gè)測(cè)試用的模塊

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集成

對(duì)于使用pyinstaller打包的應(yīng)用程序,如果使用上面的代碼,運(yùn)行打包后的程序會(huì)出現(xiàn)下面的錯(cuò)誤

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

這里錯(cuò)誤的原因是 pyinstaller 在打包分析類的時(shí)候沒有分析到 my_modules 下面的模塊,所以運(yùn)行報(bào)錯(cuò)。

解決辦法一:

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

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 打包的時(shí)候,指定 “–hidden-import”,如下

pyinstaller -D --hidden-import my_modules.my_module test.py

解決辦法三:

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

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

相關(guān)文章

  • Pandas標(biāo)記刪除重復(fù)記錄的方法

    Pandas標(biāo)記刪除重復(fù)記錄的方法

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

    使用tensorflow實(shí)現(xiàn)AlexNet

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

    python使用PyQt5的簡(jiǎn)單方法

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

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

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

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

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

    python中的全局變量用法分析

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

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

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

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

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

    Python 讀取WAV音頻文件 畫頻譜的實(shí)例

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

    解決Jupyter因卸載重裝導(dǎo)致的問題修復(fù)

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

最新評(píng)論