Python實(shí)現(xiàn)動(dòng)態(tài)加載模塊、類(lèi)、函數(shù)的方法分析
本文實(shí)例講述了Python實(shí)現(xiàn)動(dòng)態(tài)加載模塊、類(lèi)、函數(shù)的方法。分享給大家供大家參考,具體如下:
動(dòng)態(tài)加載模塊:
方式1:系統(tǒng)函數(shù)__import__()
方式2:imp, importlib 模塊
方式3:exec 函數(shù)
動(dòng)態(tài)加載類(lèi)和函數(shù)
首先,使用加載模塊,使用內(nèi)置函數(shù)提供的反射方法getattr(),依次按照層級(jí)獲取模塊->類(lèi)\全局方法->類(lèi)對(duì)象\類(lèi)方法。
test_import_module.py
class ClassA:
def test(self):
print('test')
int_value = 1
str_value = __author__
# 全局方法,加載時(shí)會(huì)被調(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)入時(shí)會(huì)執(zhí)行全局方法。
ip_module = __import__(imp_module)
# dir()查看模塊屬性
print(dir(ip_module))
# 使用getattr()獲取imp_module的類(lèi)
test_class = getattr(ip_module, imp_class)
# 動(dòng)態(tài)加載類(lèi)test_class生成類(lèi)對(duì)象
cls_obj = test_class()
# 查看對(duì)象屬性
print(dir(cls_obj))
for attr in dir(cls_obj):
# 加載非__前綴的屬性
if attr[0] != '_':
# 獲取導(dǎo)入obj方法。
class_attr_obj = getattr(cls_obj, attr)
# 判斷類(lèi)屬性是否為函數(shù)
if hasattr(class_attr_obj, '__call__'):
# 執(zhí)行函數(shù)
class_attr_obj()
else:
# 輸出類(lèi)屬性值
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__(),操作更簡(jiǎn)單、靈活,支持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)入模塊。
# 重新加載模塊,但原來(lái)已經(jīng)使用的實(shí)例還是會(huì)使用舊的模塊,而新生產(chǎn)的實(shí)例會(huì)使用新的模塊,reload后還是用原來(lái)的內(nèi)存地址。
ip_module = importlib.reload(ip_module)
print(getattr(ip_module, imp_class).int_value)
# 循環(huán)多次加載相同文件,手動(dòng)修改文件數(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)容感興趣的讀者可查看本站專(zhuān)題:《Python編碼操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python實(shí)現(xiàn)自動(dòng)登錄百度空間的方法
這篇文章主要介紹了Python實(shí)現(xiàn)自動(dòng)登錄百度空間的方法,涉及Python的http請(qǐng)求發(fā)送、獲取響應(yīng)、cookie操作等相關(guān)技巧,需要的朋友可以參考下2017-06-06
python獲取網(wǎng)絡(luò)圖片方法及整理過(guò)程詳解
這篇文章主要介紹了python獲取網(wǎng)絡(luò)圖片方法及整理過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Python語(yǔ)言檢測(cè)模塊langid和langdetect的使用實(shí)例
今天小編就為大家分享一篇關(guān)于Python語(yǔ)言檢測(cè)模塊langid和langdetect的使用實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
解決python存數(shù)據(jù)庫(kù)速度太慢的問(wèn)題
這篇文章主要介紹了解決python存數(shù)據(jù)庫(kù)速度太慢的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
python使用redis實(shí)現(xiàn)消息隊(duì)列(異步)的實(shí)現(xiàn)完整例程
本文主要介紹了python使用redis實(shí)現(xiàn)消息隊(duì)列(異步)的實(shí)現(xiàn)完整例程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
python3下pygame如何實(shí)現(xiàn)顯示中文
這篇文章主要介紹了python3下pygame如何實(shí)現(xiàn)顯示中文,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
python使用tomorrow實(shí)現(xiàn)多線程的例子
今天小編就為大家分享一篇python使用tomorrow實(shí)現(xiàn)多線程的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
解決c++調(diào)用python中文亂碼問(wèn)題
這篇文章主要介紹了c++調(diào)用python中文亂碼問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07

