# 为什么要把类写在配置文件里? # 把类名写在配置文件里,比如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())