Python使用classmethods/staticmethods登录类
我想登录分布在几个模块上的对象和类 通常,如果存在(根)记录器实例,我会检入类的构造函数,然后将其传递给对象Python使用classmethods/staticmethods登录类,python,class,oop,logging,Python,Class,Oop,Logging,我想登录分布在几个模块上的对象和类 通常,如果存在(根)记录器实例,我会检入类的构造函数,然后将其传递给对象 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(
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")
但是我如何使这个记录器对我的实用程序类可用,它只包含ClassMethods/Staticmethods
我正在寻找这样的smth:
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")
我知道上面的代码不起作用,但我希望它清楚地说明我在寻找什么
欢迎提出任何想法/最佳实践
def __init__(self, logger=None):
self.__class__.logger = logger or logging.getLogger(cls.__class__.__name__)
当然,这将在每次创建类的新实例时将一个新的记录器绑定到该类上,该实例可能不是您想要的(或者可能是……我不确定)1
我不推荐的另一种方法是使用元类获取logger2:
一般来说,我会考虑一个由大多数类/静态方法组成的类,这是一个有点可疑的设计。但是如果不知道实际的代码,就很难提供更好的建议
2我大部分时间都在发布这篇文章,以便我能记住在其他应用程序中如何做到这一点。。。我不建议在这里使用它…不,我不想创建该类的实例。带有classmethods/staticmethods的类只是一组辅助函数,聚合在一个类中(主要是为了方便起见)。为什么不使用模块而不是类呢?@user2292376——我同意@kindall。根据类方法的数量,模块可能会更好。除此之外,如果您不想拥有
\uuuuu init\uuuuu
,那么您可以直接将记录器放在类上。您甚至可以使用元类来创建类属性(尽管我不建议这样做)。
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