【问题标题】:How to use class attributes in method decorators in Python?如何在 Python 的方法装饰器中使用类属性?
【发布时间】:2021-12-15 13:00:53
【问题描述】:

我有一个负责记录的装饰器。例如。像这样:

import logging
import functools
from typing import Callable


def log_container(func: Callable, logger=None):
    if logger is None:
        logger = logging.getLogger("default")
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        logger.info(f"{func.__qualname__} started.")
        result = func(*args, **kwargs)
        logger.info(f"{func.__qualname__} ended.")
        return result

    return wrapper

我有一个具有不同记录器作为属性的类,我想将该记录器作为装饰器参数。这可能吗?如果有,怎么做?

class Dummy:
    logger = logging.getLogger("Dummy")
    
    @log_container(logger=Dummy.logger)
    def do_something(self):
        pass

【问题讨论】:

  • 你试过 self.logger 了吗?类属性可以在实例上找到。
  • @Yuri self 在方法装饰中使用时不起作用。

标签: python logging python-decorators python-class


【解决方案1】:

您的装饰器,正如它当前定义的那样,不起作用。您不能将装饰函数与参数一起传递,因为装饰器本身只接受一个参数:func 本身。如果你想让你的装饰器接受一个参数,你需要将装饰器嵌套更深一层。现在变成了一个返回装饰器的函数:

def log_container(logger=None):
    if logger is None:
        logger = logging.getLogger("default")

    def inner(func: Callable):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            logger.info(f"{func.__qualname__} started.")
            result = func(*args, **kwargs)
            logger.info(f"{func.__qualname__} ended.")
            return result

        return wrapper
    return inner

那么在装饰Dummy类的方法时,不要使用Dummy.logger,因为Dummy直到类定义结束才会定义,相反,您可以访问类属性logger直接。

class Dummy:
    logger = logging.getLogger("Dummy")
    
    @log_container(logger=logger)
    def do_something(self):
        pass

    # Use default logger
    @log_container()
    def do_something_else(self):
        pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 2023-03-10
    • 2020-10-07
    • 2016-03-17
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多