52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
:authors: python273
|
||
:license: Apache License, Version 2.0, see LICENSE file
|
||
|
||
:copyright: (c) 2019 python273
|
||
"""
|
||
|
||
|
||
class BaseConfig(object):
|
||
""" Абстрактный базовый класс конфигурации.
|
||
У наследуемых классов должен быть определен `__slots__`
|
||
|
||
:param section: имя подкатегории в конфиге
|
||
:param \*\*kwargs: будут переданы в :func:`load`
|
||
"""
|
||
|
||
__slots__ = ('section_name', '_settings', '_section')
|
||
|
||
def __init__(self, section, **kwargs):
|
||
self.section_name = section
|
||
|
||
self._settings = self.load(**kwargs)
|
||
self._section = self._settings.setdefault(section, {})
|
||
|
||
def __getattr__(self, name):
|
||
return self._section.get(name)
|
||
|
||
__getitem__ = __getattr__
|
||
|
||
def __setattr__(self, name, value):
|
||
try:
|
||
super(BaseConfig, self).__setattr__(name, value)
|
||
except AttributeError:
|
||
self._section[name] = value
|
||
|
||
__setitem__ = __setattr__
|
||
|
||
def setdefault(self, k, d=None):
|
||
return self._section.setdefault(k, d)
|
||
|
||
def clear_section(self):
|
||
self._section.clear()
|
||
|
||
def load(self, **kwargs):
|
||
"""Абстрактный метод, должен возвращать dict с конфигом"""
|
||
raise NotImplementedError
|
||
|
||
def save(self):
|
||
"""Абстрактный метод, должен сохранять конфиг"""
|
||
raise NotImplementedError
|