一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python中動態創建類實例的方法

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

2020-09-25 10:15腳本之家 Python

在Java中我們可以通過反射來根據類名創建類實例,那么在Python我們怎么實現類似功能呢?其實在Python有一個builtin函數import,我們可以使用這個函數來在運行時動態加載一些模塊

簡介

在Java中我們可以通過反射來根據名創建類實例,那么在Python我們怎么實現類似功能呢?

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

?
1
2
3
4
5
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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

?
1
2
3
class MyAnotherObject(object):
  def test(self):
    print 'MyAnotherObject.test'

test.py

?
1
2
3
4
5
6
7
8
9
10
11
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打包的應用程序,如果使用上面的代碼,運行打包后的程序會出現下面的錯誤

?
1
2
3
4
5
6
7
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,見下面代碼中的第一行。這種方法最簡單,但是顯然不太好。

?
1
2
3
4
5
6
7
8
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”,如下

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

解決辦法三:

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

?
1
2
3
4
5
6
7
8
9
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中動態創建類實例的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品午夜视频 | 日韩免费在线观看 | 国产高清在线观看 | 国语自产拍在线观看7m | 免费特黄一区二区三区视频一 | 夫妻性生活影院 | 恩不要好大好硬好爽3p | 欧美日韩国产精品自在自线 | 久草在线福利资站免费视频 | 啊好大好爽 | 视频在线观看入口一二三2021 | 午夜宅男网 | 免看一级a一片成人123 | 久久99热在线观看7 久久99精品涩AV毛片观看 | 精品区卡一卡2卡三免费 | 视频在线观看入口一二三2021 | 2020年国产精品午夜福利在线观看 | 国产一级视频在线观看 | 国产精品久久久精品视频 | 国产精品永久免费自在线观看 | 成年人在线视频观看 | 日韩欧美推理片免费看完整版 | a级情欲片在线观看hd | 日本高清中文字幕视频在线 | 美女被视频网站 | 亚洲欧美日韩天堂 | 无人在线视频高清免费播放 | 亚洲精品在看在线观看 | 韩国三级理韩国三级理人伦 | 欧美一级欧美一级高清 | 视频在线观看高清免费看 | 日韩黄色影视 | 日韩国产欧美成人一区二区影院 | 美女gif趴跪式抽搐动态图 | 亚洲色欲色欲综合网站 | 国内精品久久久久影院网站 | 国产欧美一区二区三区久久 | 好男人免费高清在线观看2019 | 亚洲免费视 | 欧美成人aaaa免费高清 | 故意短裙公车被强好爽在线播放 |