zoukankan      html  css  js  c++  java
  • 一种高级的软件设计模式(配置文件的插拔式设计)

    关于配置文件的设计

    查阅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

     

     顶

  • 相关阅读:
    停滞的代码
    民兵葛二蛋大结局
    该开始BS了
    今天写出了第一个.NetBS应用
    读源码,仿照
    MVN,老天怎么回事?
    从哪里入手
    学习Java了
    工厂方法模式与简单工厂
    转:悟透JavaScript
  • 原文地址:https://www.cnblogs.com/csic716/p/12163120.html
Copyright © 2011-2022 走看看