Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2013 18:44:33

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

logging singleton

Вот мучил-мучил, как сделать нормально логирование, и намучил вот такое:

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, и тогда инстансу класса присваивался результат вызова…
Также видел ещё один вариант - внутри класса ещё один класс, который как будто синглтон, и тогда без суперов всё обходилось и то сё…
В общем, что хотелось бы услышать от вас - так как же правильно реализовать одиночку для логгирования и зачем там тот супер. В общем, на пальцах объяснить работу с синглтоном, если можно.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#2 Янв. 9, 2014 15:48:14

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

logging singleton

Во первых не `self`, а `cls`, зачем себя и людей обманывать. А во вторых:

logger = None
def Logger():
    global logger
    if not logger:
        # ...
    return logger

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

..bw



Офлайн

#3 Янв. 9, 2014 21:10:46

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

logging singleton

Можно поподробней про self, cls и прочее? )



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#4 Янв. 9, 2014 21:10:46

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

logging singleton

Можно поподробней про self, cls и прочее? )



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#5 Янв. 10, 2014 02:27:19

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

logging singleton

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

..bw



Офлайн

#6 Янв. 11, 2014 08:55:41

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

logging singleton

Красиво сказано, но всё же вообще, моя схема вроде работает, или там есть какие-то затыки и сделать надо по другому?



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#7 Янв. 11, 2014 21:17:16

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

logging singleton

Master_Sergius, работать-то оно может и работает, но это плохой подход.
Код пишется в первую очередь для людей. В вашем случае он неоправданно усложнен.

Просто используйте функцию, как посоветовал вам bw в сообщении #2.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version