Python中動態(tài)創(chuàng)建類實例的方法
簡介
在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打包的應用程序,如果使用上面的代碼,運行打包后的程序會出現(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)站的支持!
- python實現(xiàn)動態(tài)創(chuàng)建類的方法分析
- python 動態(tài)獲取當前運行的類名和函數(shù)名的方法
- Python實現(xiàn)動態(tài)添加類的屬性或成員函數(shù)的解決方法
- Python實現(xiàn)動態(tài)加載模塊、類、函數(shù)的方法分析
- 在python的類中動態(tài)添加屬性與生成對象
- Python類的動態(tài)修改的實例方法
- python 類對象和實例對象動態(tài)添加方法(分享)
- python類的方法屬性與方法屬性的動態(tài)綁定代碼詳解
- Python內置函數(shù)Type()函數(shù)一個有趣的用法
- 詳解Python中的type()方法的使用
- Python使用type動態(tài)創(chuàng)建類操作示例
相關文章
python3解析庫BeautifulSoup4的安裝配置與基本用法
簡單來說,BeautifulSoup就是Python的一個HTML或XML的解析庫,我們可以用它來方便地從網(wǎng)頁中提取數(shù)據(jù),下面這篇文章主要給大家介紹了關于python3解析庫BeautifulSoup4的安裝配置與基本用法的相關資料,需要的朋友可以參考下2018-06-06
Python實現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法
下面小編就為大家?guī)硪黄狿ython實現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Python實現(xiàn)Matplotlib,Seaborn動態(tài)數(shù)據(jù)圖的示例代碼
這篇文章主要為大家詳細介紹了如何讓Matplotlib、Seaborn的靜態(tài)數(shù)據(jù)圖動起來,變得栩栩如生。文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下2022-05-05

