一种高级的软件设计模式(配置文件的插拔式设计)
关于配置文件的设计
查阅django中settings的源代码中,可以学到一种值得借鉴的设计模式。即软件先存一份默认参数的配置文件,再暴露一个配置文件提供部分参数给用户进行修改。软件运行的时候,优先检索并使用暴露的配置文件中的参数,其次再检索默认的配置文件。
前提知识:
1、模块 importlib 的import_module方法
import importlib md = importlib.import_module('conf.settings') # 根据字符串‘conf.settings’导入conf中的settings模块,此时md就等价于settings模块
importlib.import_module( ) 方法实现了用字符串来导入模块的功能!!!
2、内置函数 dir( )
dir(模块) 获取模块(.py文件)中的所有的属性!!!
3、os.environ 是一个系统相关的大字典,借助他可以进行临时的存取值.
os.environ.setdefault(key,value) 或者os.environ[key] = value 都可以
在用户自定义的配置文件中:
# _*_ coding: gbk _*_ # @Author: Wonder import os BASE_PATH = os.path.dirname(os.path.dirname(__file__)) HHHH = '这是我特殊化配置的,因为我写了'
系统默认配置的文件夹 lib/conf 中,存放两个文件:
第一个文件存__init__.py
# _*_ coding: gbk _*_ # @Author: Wonder import os from lib.conf import globle_settings import importlib SETTINGS_MODULE = 'MY_SETTING_MODULE' class Settings: def __init__(self): # 获取全局变量中的配置信息 for attr in dir(globle_settings): if attr.isupper(): setattr(self, attr, getattr(globle_settings, attr)) my_set_path = os.environ.get(SETTINGS_MODULE) print(my_set_path, '***********') cus_set = importlib.import_module(my_set_path) for attr in dir(cus_set): if attr.isupper(): setattr(self,attr,getattr(cus_set,attr)) settings = Settings()
第二个文件存默认配置文件global_setting.py
# _*_ coding: gbk _*_ # @Author: Wonder HHHH = '这是系统默认配置的,如果别人不写就用这个'
启动文件start中:添加自定义配置文件的地址‘ conf.settings ’
# _*_ coding: gbk _*_ # @Author: Wonder import os import sys from conf import settings sys.path.append(settings.BASE_PATH) if __name__ == '__main__': os.environ.setdefault('MY_SETTING_MODULE', 'conf.settings') # 提供用户自定义的配置文件的地址 from lib.conf import settings print(settings.HHHH)
顶