首先为什么我们要转换class呢?下边示例一下你就明白了
例:
a = {'a': 1, 'b': {'r': 2}, 'c': {'z': 4, 'w': 3}, 'd': 4, 'e': 5}
我们要获取c字典里边的z的内容:
a['c']['z']
或
a.get('c').get('z')
如果我们转换class,这样获取
a.c.z
这样我们就拿到想要的结果
是不是很便利呢
以下是代码:
# -*- coding:utf-8 -*-
# @Time: 2022/8/25 15:34
# @File: config.py
# @Software: PyCharm
import yaml, os
from icecream import ic
# cfg.yaml 配置文件内容
'''
database:
ip: 192.168.2.1
port: 8080
redis:
ip: 192.168.2.2
port: 6379
host:
group:
name: qqq
passwd: 333
'''
class DictToClass(object):
'''
;;将字典准换为 class 类型
'''
@classmethod
def _to_class(cls, _obj):
_obj_ = type('new', (object,), _obj)
[setattr(_obj_, key, cls._to_class(value)) if isinstance(value, dict) else setattr(_obj_, key, value) for
key, value in _obj.items()]
return _obj_
class ReadConfigFiles(object):
def __init__(self):
'''
;;获取当前工作路径
'''
self.works_path = os.path.dirname(os.path.realpath(__file__))
@classmethod
def open_file(cls):
'''
;;读取当前工作目录下cfg.yaml文件内容,并返回字典类型
:return:
'''
return yaml.load(
open(os.path.join(cls().works_path, r'cfg.yaml'), 'r', encoding='utf-8').read(), Loader=yaml.FullLoader
)
@classmethod
def cfg(cls, item=None):
'''
;;调用该方法获取需要的配置,item如果为None,返回则是全部配置
:param item:
:return:
'''
return DictToClass._to_class(cls.open_file().get(item) if item else cls.open_file())
if __name__ == '__main__':
'''
;;调用ReadConfigFiles.cfg('传递参数 or null')
'''
cfg = ReadConfigFiles.cfg()
# 测试输出
ic(cfg.host.group)
python.exe config.py
ic| cfg: <__main__.DictToClass object at 0x0000024CEA694A58>
Process finished with exit code 0