如何在 Python 的方法装饰器中使用 class 属性?
How to use class attributes in method decorators in Python?
我有一个负责日志记录的装饰器。例如。像这样:
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,它有一个独特的记录器作为属性,我想将该记录器作为装饰器参数。这可能吗?如果是,怎么做?
class Dummy:
logger = logging.getLogger("Dummy")
@log_container(logger=Dummy.logger)
def do_something(self):
pass
您当前定义的装饰器不起作用。您不能将装饰函数与参数一起传入,因为装饰器本身只接受一个参数:func
本身。如果你想让你的装饰器接受一个参数,你需要将装饰器嵌套得更深一层。现在变成了 returns 装饰器的函数:
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
class装饰方法时,不要使用Dummy.logger
,因为Dummy
直到[=结束时才会被定义21=] 定义,相反,您可以直接访问 class 属性 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
我有一个负责日志记录的装饰器。例如。像这样:
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,它有一个独特的记录器作为属性,我想将该记录器作为装饰器参数。这可能吗?如果是,怎么做?
class Dummy:
logger = logging.getLogger("Dummy")
@log_container(logger=Dummy.logger)
def do_something(self):
pass
您当前定义的装饰器不起作用。您不能将装饰函数与参数一起传入,因为装饰器本身只接受一个参数:func
本身。如果你想让你的装饰器接受一个参数,你需要将装饰器嵌套得更深一层。现在变成了 returns 装饰器的函数:
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
class装饰方法时,不要使用Dummy.logger
,因为Dummy
直到[=结束时才会被定义21=] 定义,相反,您可以直接访问 class 属性 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