【发布时间】:2021-10-31 05:38:22
【问题描述】:
假设有一个类有函数:
class Tester:
@Logger()
def __init__(self):
print(__class__)
@Logger()
def func(self, num):
return num**2
其中Logger是一个装饰器,大致定义为:
from typing import Optional, Any
from logging import getLogger
class Logger:
def __init__(self):
self.logger = getLogger()
self.logging_function = getattr(self, 'function')
def __call__(self, decorator: callable):
def f(*args, **kwargs):
return self.logging_function(decorator, *args, **kwargs)
return f
def function(self, func: callable, *args: Optional[Any], **kwargs: Optional[Any]):
func_name = Logger.get_name(func)
self.logger.info(f"Starting: {func_name}.")
return func(*args, **kwargs)
@staticmethod
def get_name(func):
return f'__init__ {func.__class__.__name__}' if func.__name__ == '__init__' else func.__name__
我们如何编辑 Logger get_name 函数,这样如果正在运行的函数是 class __init__,则返回的名称是 __init__ Tester,但如果函数被命名为其他名称,它只会返回函数 @987654326 @?
(AKA)预期输出:
>>> test = Tester()
INFO: Starting __init__ Tester.
<class '__main__.Tester'>
>>> test.func(3)
INFO: Starting func.
9
电流输出:
>>> test = Tester()
INFO: Starting __init__ function.
<class '__main__.Tester'>
>>> test.func(3)
INFO: Starting func.
9
【问题讨论】:
-
你的意思是用
Logger()而不是Logger来装饰吗? -
Logger 类定义了 Logger 装饰器。
-
是的,我明白了,但是你是用类而不是它的实例来装饰的。这会导致错误。
-
你说得对,我刚刚修好了。
标签: python python-3.x class decorator python-decorators