/ / Python Logowanie w klasie za pomocą metod klasycznych / metod statycznych - python, klasa, oop, logowanie

Python Logowanie w klasie metodami klasy / statycznymi metodami - python, klasa, oop, logowanie

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 № 1
def __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 ...