Найти - Пользователи
Полная версия: logging singleton
Начало » Python для экспертов » logging singleton
1
Master_Sergius
Вот мучил-мучил, как сделать нормально логирование, и намучил вот такое:

import logging
class Logger(object):                                                           
     """ Class logger singleton                                                  
     """                                                                         
                                                                                 
     def __new__(self):                                                          
         if not hasattr(self, '_logger'):                                        
             self._logger = logging.getLogger('log checker')                     
             console_handler = logging.StreamHandler()                           
             console_handler.setFormatter(logging.Formatter('%(asctime)s: %(name)s - %(levelname)s: %(message)s'))
             self._logger.addHandler(console_handler)                            
         return self._logger  

Пока что всё работает как надо. Но смущает одна вешь - в паттерне синглтона из википедии там ещё вызывалась функция super, и тогда инстансу класса присваивался результат вызова…
Также видел ещё один вариант - внутри класса ещё один класс, который как будто синглтон, и тогда без суперов всё обходилось и то сё…
В общем, что хотелось бы услышать от вас - так как же правильно реализовать одиночку для логгирования и зачем там тот супер. В общем, на пальцах объяснить работу с синглтоном, если можно.
bw
Во первых не `self`, а `cls`, зачем себя и людей обманывать. А во вторых:
logger = None
def Logger():
    global logger
    if not logger:
        # ...
    return logger

Вы не создаёте экземпляр “Logger”, вы используете этот класс полностью только как функцию, про одиночек даже говорить здесь не стоит, вы и традиционный объект не содаёте: тот самый `super(…).__new__(…)` или `object.__new__(…)`.

..bw
Master_Sergius
Можно поподробней про self, cls и прочее? )
Master_Sergius
Можно поподробней про self, cls и прочее? )
bw
Есть такая древняя традиция, иногда соблюдаемая в программировании: называть вещи своими именами. Как то, в народе принято именем “self” указывать на экземпляр класса к которому привязан соответствующий метод, а вот “cls” (или можно встретить “klass”) указывает на класс и используется в классовых методах так же как и “self” в обычных. И так как `__new__` является ни чем иным как классовым методом и первым аргументом он получает ну ни как не экземпляр класса, а сам класс (а вернуть должен экземпляр этого класса, если что), то и обозначать его стоит надлежащим образом. Хотя понятно, что это всё условности и в действительности хоть “shit” назови, Python всё стерпит.

..bw
Master_Sergius
Красиво сказано, но всё же вообще, моя схема вроде работает, или там есть какие-то затыки и сделать надо по другому?
GaiveR
Master_Sergius, работать-то оно может и работает, но это плохой подход.
Код пишется в первую очередь для людей. В вашем случае он неоправданно усложнен.

Просто используйте функцию, как посоветовал вам bw в сообщении #2.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB