@MasterCopipaster

Как можно сделать метод класса сразу статическим и динамическим?

Всем привет - имеем такой логер.
class LoggerHandler:
    """
    Responsible for logging logs
    """
    SUPPORT_NAME_FILE: str = 'file'
    SUPPORT_NAME_CONSOLE: str = 'console'
    LEVEL_DEBUG = 'debug'
    LEVEL_INFO = 'info'
    LEVEL_ERROR = 'error'
    LEVEL_WARNING = 'warning'
    LEVEL_FATAL = 'fatal'
    FILE_NAME = 'log.txt'

    _instance = None

    def __init__(self):
        self.__logger = LoggerBuilder.build(Config())

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.__logger = LoggerBuilder.build(Config())
        return cls._instance

    def write(self, event: LoggerMessages, **kwargs) -> None:
        pass


Сам по себе класс является синглтоном, и иницилизируется ядром программы.
Мне очень хочется провернуть вот какой трюк, я хочу что бы метод write был доступен как динамическое так и статическое свойство. (Я знаю что я не должен этого хотеть - но мне очень хочется изе...эм... удобный класс). т.к. логер используется по сути везде где угодно. Но понятие не имею как это сделать, понятно только пока только одно, что при вызове этого метода как статического надо чекать что инстанс существует. Но вот как сделать возможность такова (возможность вызова write как статического так и динамического свойства)?
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 2
fenrir1121
@fenrir1121
Начни с документации
Статический метод - это метод, который не может изменить состояние экземпляров или класса и соответственно не принимает cls или self.
Чтобы его вызвать в любом случае необходим инстанс, так что не очень понятно как и зачем вы хотите проверять что инстанс существует. Ну и следовательно не ясно чего вы пытаетесь добиться.

Возможно вы пытаетесь изобрести динамические атрибуты, в этом случае посмотрите в сторону property или cached_property

Если же нет лучше сформулируйте конечную задачу, сейчас это выглядит словно вы пытаетесь изобрести квадратные колеса.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
По-хорошему должен быть только один способ работать с твоим классом. Выбери что-то одно и придерживайся этого подхода.

Если очень хочется выстрелить себе в ногу, сделай метод статическим - это обеспечит его вызов и на классе, и на экземпляре - а внутри методла получай доступ к синглтон-экземпляру и работай с ним.

Ну и да, я надеюсь что логгер ты пишешь только как упражнение, а не потому что не знаешь о модуле logging. =)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы