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

Python實現(xiàn)動態(tài)加載模塊、類、函數(shù)的方法分析

 更新時間:2017年07月18日 11:21:03   作者:shijc_csdn  
這篇文章主要介紹了Python實現(xiàn)動態(tài)加載模塊、類、函數(shù)的方法,結(jié)合實例形式分析了Python動態(tài)加載模塊、類及函數(shù)的實現(xiàn)方法及操作技巧,需要的朋友可以參考下

本文實例講述了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īng)典教程

希望本文所述對大家Python程序設(shè)計有所幫助。

相關(guān)文章

最新評論