一种高级的软件设计模式(配置文件的插拔式设计)

关于配置文件的设计

查阅django中settings的源代码中,可以学到一种值得借鉴的设计模式。即软件先存一份默认参数的配置文件,再暴露一个配置文件提供部分参数给用户进行修改。软件运行的时候,优先检索并使用暴露的配置文件中的参数,其次再检索默认的配置文件。

 

前提知识:

1、模块 importlibimport_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 = '这是我特殊化配置的,因为我写了'
用户自定义的配置文件conf/settings

 

系统默认配置的文件夹 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()
lib/conf/__init__.py

第二个文件存默认配置文件global_setting.py

# _*_ coding: gbk _*_
# @Author: Wonder
HHHH = '这是系统默认配置的,如果别人不写就用这个'
lib/conf/global_setting.py

 

启动文件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)
start.py

 

 

 

 

 

 

 顶

posted @ 2020-01-07 18:27  HEU葉孤城  阅读(836)  评论(0编辑  收藏  举报