反射的應用 | Python
阿新 • • 發佈:2017-12-27
class max sse 對象 classes info 字符 onf cls
# 為什麽要把類寫在配置文件裏? # 把類名寫在配置文件裏,比如django,添加一個中間件配置,為什麽我們就可以直接調用這個類了? MIDDLEWARE_CLASSES = ( ‘應用名.middleware.ForbiddenIpsMiddleware‘, ) # 其實內部做了一個反射的操作,在middleware這個模塊中, # 載入了ForbiddenIpsMiddleware這個類; # 那麽問題來了,通過這個一個字符串怎麽找到這個類呢? # 反射。
# echo_one.py class EchoOne(): def run(self):return ‘1‘ # echo_two.py class EchoTwo(): def run(self): return ‘2‘ # echo_three.py class EchoThree(): def run(self): return ‘3‘
# 給python解釋器添加路徑 import os, sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # print(os.path.abspath(__file__))# print(os.path.dirname(os.path.abspath(__file__))) # print(BASE_DIR) # >> /home/python/Desktop/echo/conf.py # >> /home/python/Desktop/echo # >> /home/python/Desktop # 根目錄 sys.path.append(BASE_DIR) settings = { ‘ret01‘: ‘echo.class01.echo_one.EchoOne‘, ‘ret02‘: ‘echo.class01.echo_two.EchoTwo‘, ‘ret03‘: ‘echo.class01.echo_three.EchoThree‘, }
from conf import settings for k,v in settings.items(): # 要在這裏循環註冊配置文件中寫的每個類 # 1.將字符串拆分成‘類所在的包路徑‘|‘類名‘ module_path, classname = v.rsplit(‘.‘, maxsplit=1) # 2.獲取類所在模塊對象 import importlib m = importlib.import_module(module_path) # print(m) # 3.根據根據類名(模塊的屬性),從模塊中反射出對應的類 cls = getattr(m, classname) # 4.執行一下類中的方法確認操作是否正確 print(cls().run())
反射的應用 | Python