• 封装读取配置类python&java实现


    场景:

    某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

    一、python实现:

    1.1 读取单个配置文件

    数据库配置文件 configuration.yml

    1. DB:
    2. host: 1
    3. username: 12
    4. password: 12
    5. database: 14
    6. databasetype: 15
    7. port: 33
    8. note: C

    自定义类MyDbinfo,存储数据库配置

    1. import yaml
    2. from singleton import singleton
    3. @singleton
    4. class MyDbinfo(object):
    5. def __init__(self):
    6. _filePath = "/Users/zhaohui/PycharmProjects/TestSingleton/configuration.yml"
    7. f = open(_filePath, 'r', encoding='utf-8')
    8. cont = f.read()
    9. x = yaml.load(cont, Loader=yaml.FullLoader)
    10. self.host =x['DB']['host']
    11. self.username=x['DB']['username']
    12. self.password=x['DB']['password']
    13. self.database=x['DB']['database']
    14. self.port=x['DB']['port']
    15. self.note = x['DB']['note']
     
    

    这里用到了注解的单例模式singleton

    1. def singleton(cls,*args,**kw):
    2. instances = {}
    3. def _singleton():
    4. if cls not in instances:
    5. instances[cls] = cls(*args,**kw)
    6. return instances[cls]
    7. return _singleton

    调用一下试试

    1. from MyDbinfo import MyDbinfo
    2. myDbinfo1 = MyDbinfo()
    3. myDbinfo2 = MyDbinfo()
    4. if __name__ == '__main__':
    5. print(myDbinfo1)
    6. print(myDbinfo2)

    打印结果:

    1. <MyDbinfo.MyDbinfo object at 0x7fb610194110>
    2. <MyDbinfo.MyDbinfo object at 0x7fb610194110>

    两个实例的物理地址是一样的,说明是单例的。

    1.2 读取多个数据库文件

    新建一个类,DbInfo 存储数据库信息

    1. class DbInfo():
    2. # 在构造器里直接赋值,好像就不要写属性了。省了get和set方法了?
    3. def __init__(self,host=None,username=None,password=None,database=None,databasetype=None,port=None,note=None,charset="utf8"):
    4. self.host: str = host
    5. self.username: str= username
    6. self.password: str = password
    7. self.database: str = database
    8. self.databasetype: str = databasetype
    9. self.port: str = port
    10. self.note:str = note
    11. self.charset:str = charset

    写一个读取方法,输入文件的地址,输出DbInfo

    YmlUtil.py

    1. import yaml
    2. from DbInfo import DbInfo
    3. class YmlUtil():
    4. # path = os.path.abspath()
    5. @staticmethod
    6. def readDbYml(filePath:str) -> DbInfo:
    7. f = open(filePath, 'r', encoding='utf-8')
    8. cont = f.read()
    9. x = yaml.load(cont,Loader=yaml.FullLoader)
    10. print(x['DB'])
    11. print(x['DB']['host'])
    12. dbInfo=DbInfo(host=x['DB']['host'],
    13. username=x['DB']['username'],
    14. password=x['DB']['password'],
    15. database=x['DB']['database'],
    16. port=x['DB']['port']
    17. )
    18. # 设置类属性——setattr(object,key,value)
    19. # 类似于建造者模式
    20. setattr(dbInfo,"note",x['DB']['note'])
    21. return dbInfo

    注解的单例模式:

    singleton.py

    1. def singleton(cls,*args,**kw):
    2. instances = {}
    3. def _singleton():
    4. if cls not in instances:
    5. instances[cls] = cls(*args,**kw)
    6. return instances[cls]
    7. return _singleton

    得到实体类的方法

    1. @singleton
    2. def getMyDbinfo():
    3. return YmlUtil.readDbYml("/Users/zhaohui/PycharmProjects/TestSingleton/configuration.yml")

    测试一下得到实体类

    1. a = getMyDbinfo()
    2. b = getMyDbinfo()
    3. print(a)
    4. print(b)

    打印结果:

    1. <DbInfo.DbInfo object at 0x7f9a783b0ed0>
    2. <DbInfo.DbInfo object at 0x7f9a783b0ed0>

    这样得到的实体类,也是单例的。

    二、Java实现

  • 相关阅读:
    五大步骤实现MapGIS Web 功能服务拓展
    flask操作数据库
    【iOS-UIImagePickerController访问相机和相册】
    爱普生LQ1900KIIH复位方法
    【A-024】基于SSH的房屋租赁管理系统(含论文)
    基于SSM的人事档案管理系统(有报告)。Javaee项目。
    打开 Java 新的大门,Solon v2.5.10 发布
    高级程序员项目经理写好代码必备的三条基本素质;以及代码的现象和本质问题解读;
    Codeforces Round 515
    淘宝/天猫API:seller_info-获得淘宝店铺详情
  • 原文地址:https://blog.csdn.net/qq_39208536/article/details/125407852