Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用classmethods/staticmethods登录类_Python_Class_Oop_Logging - Fatal编程技术网

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