Python實現(xiàn)動態(tài)加載模塊、類、函數(shù)的方法分析
本文實例講述了Python實現(xiàn)動態(tài)加載模塊、類、函數(shù)的方法。分享給大家供大家參考,具體如下:
動態(tài)加載模塊:
方式1:系統(tǒng)函數(shù)__import__()
方式2:imp, importlib 模塊
方式3:exec 函數(shù)
動態(tài)加載類和函數(shù)
首先,使用加載模塊,使用內(nèi)置函數(shù)提供的反射方法getattr(),依次按照層級獲取模塊->類\全局方法->類對象\類方法。
test_import_module.py
class ClassA:
def test(self):
print('test')
int_value = 1
str_value = __author__
# 全局方法,加載時會被調(diào)用
print(__file__, 'global function.')
if __name__ == '__main__':
print(__file__, __name__)
test_import_module.py
# 注意:模塊名不包括.py后綴
imp_module = 'test_import_class'
imp_class = 'ClassA'
# 方式1:使用__import__()導(dǎo)入模塊
# 導(dǎo)入指定模塊,導(dǎo)入時會執(zhí)行全局方法。
ip_module = __import__(imp_module)
# dir()查看模塊屬性
print(dir(ip_module))
# 使用getattr()獲取imp_module的類
test_class = getattr(ip_module, imp_class)
# 動態(tài)加載類test_class生成類對象
cls_obj = test_class()
# 查看對象屬性
print(dir(cls_obj))
for attr in dir(cls_obj):
# 加載非__前綴的屬性
if attr[0] != '_':
# 獲取導(dǎo)入obj方法。
class_attr_obj = getattr(cls_obj, attr)
# 判斷類屬性是否為函數(shù)
if hasattr(class_attr_obj, '__call__'):
# 執(zhí)行函數(shù)
class_attr_obj()
else:
# 輸出類屬性值
print(attr, ' type:', type(class_attr_obj), ' value:', class_attr_obj)
輸出結(jié)果
D:/work/python\test_import_class.py global function. ['ClassA', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__'] ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'int_value', 'str_value', 'test'] int_value type: <class 'int'> value: 1 str_value type: <class 'str'> value: abc test
# 方式2:使用importlib
# importlib相比__import__(),操作更簡單、靈活,支持reload()
import importlib
ip_module = importlib.import_module('.', imp_module)
ip_module_cls = getattr(ip_module, imp_class)
cls_obj = ip_module_cls()
if 'int_value' in dir(cls_obj):
print(cls_obj.int_value)
cls_obj.int_value = 10
print(cls_obj.int_value)
# reload()重新加載,一般用于原模塊有變化等特殊情況。
# reload()之前該模塊必須已經(jīng)使用import導(dǎo)入模塊。
# 重新加載模塊,但原來已經(jīng)使用的實例還是會使用舊的模塊,而新生產(chǎn)的實例會使用新的模塊,reload后還是用原來的內(nèi)存地址。
ip_module = importlib.reload(ip_module)
print(getattr(ip_module, imp_class).int_value)
# 循環(huán)多次加載相同文件,手動修改文件數(shù)據(jù),發(fā)現(xiàn)重新加載后輸出內(nèi)容變更。
from time import sleep
for i in range(30):
ip_module = importlib.reload(ip_module)
print(getattr(ip_module, imp_class).int_value)
sleep(3)
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python編碼操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
python獲取網(wǎng)絡(luò)圖片方法及整理過程詳解
這篇文章主要介紹了python獲取網(wǎng)絡(luò)圖片方法及整理過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
Python語言檢測模塊langid和langdetect的使用實例
今天小編就為大家分享一篇關(guān)于Python語言檢測模塊langid和langdetect的使用實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02
python使用redis實現(xiàn)消息隊列(異步)的實現(xiàn)完整例程
本文主要介紹了python使用redis實現(xiàn)消息隊列(異步)的實現(xiàn)完整例程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
python使用tomorrow實現(xiàn)多線程的例子
今天小編就為大家分享一篇python使用tomorrow實現(xiàn)多線程的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07

