Chcę rejestrować obiekty i klasy rozłożone na kilka modułów.
Zazwyczaj sprawdzam w konstruktorze klasy, czy istnieje istniejąca (root) wersja loggera i przekazuję ją do obiektu.
import logging
from logging import config
class TestClass(object):
def __init__(self, logger=None):
self.logger = logger or logging.getLogger(self.__class__.__name__)
def bar(self):
self.logger.info("Hi, Bar")
ale w jaki sposób udostępnić ten rejestrator dla mojej klasy narzędziowej, która zawiera tylko metody klasy ClassMethods / Static?
Szukam czegoś takiego:
class TestClass(object):
def __init__(cls, logger=None):
cls.logger = logger or logging.getLogger(cls.__class__.__name__)
@classmethod
def foo(cls):
cls.logger.info("Hi, Foo")
Wiem, że powyższy kod nie działa, ale mam nadzieję, że wyjaśnia to, czego szukam.
Każdy pomysł / najlepsze praktyki są doceniane!
Odpowiedzi:
0 dla odpowiedzi № 1def __init__(self, logger=None):
self.__class__.logger = logger or logging.getLogger(cls.__class__.__name__)
Oczywiście spowoduje to powiązanie nowego rejestratora z klasą za każdym razem, gdy utworzysz nową instancję klasy, która prawdopodobnie nie jest tym, czego potrzebujesz (a może jest ... Nie jestem pewien)1
Innym podejściem, którego nie polecam byłoby użycie metaklasu do uzyskania programu rejestrującego2:
import logging
class Foo(type):
@property
def logger(cls):
try:
return cls._logger
except AttributeError:
cls._logger = logging.getLogger(cls.__name__)
return cls._logger
class Bar(object):
__metaclass__ = Foo
print Bar.logger
print Bar.logger is Bar.logger # verify we only created one logger instance.
# careful though, the following DOESN"T work:
print Bar().logger # AttributeError :-P
1Generalnie uważam, że klasa składająca się głównie z metod klasy / statycznej może być nieco podejrzanym projektem. Nie znając jednak prawdziwego kodu, trudno jest zapewnić lepszą radę ...
2Przeważnie publikuję to, aby zapamiętać jak to zrobić w innych aplikacjach ... Nie polecam tego używać tutaj ...