1. 程式人生 > >反射的應用 | Python

反射的應用 | Python

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