python自定义装饰器类是怎么使用的?

定义装饰器类(通过__call__魔术方法使得对象可以当成函数调用)",跟着教程走,但是完全不懂这个类的运用。

代码如下

from functools import wraps
from time import time

class Record():
"""自定义装饰器类(通过__call__魔术方法使得对象可以当成函数调用)"""

def __init__(self, output):
self.output = output

def __call__(self, func):
@wraps(func)
def wrapper(args, *kwargs):
start = time()
result = func(args, *kwargs)
self.output(func.__name__, time() - start)
return result
return wrapper

我的尝试运用如下:

def add(a,b):
print(a+b)
return a+b

R=Record(print)
R(add(1,2))

输出了3,但是没有输出装饰器内容,并没有预想的计时器输出

正确的写法应该是这样:

from functools import wraps
from time import time


class Record(object):
    """自定义装饰器类(通过__call__魔术方法使得对象可以当成函数调用)"""

    def __init__(self, output):
        self.output = output

    def __call__(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            start = time()
            result = func(*args, **kwargs)
            self.output(func.__name__, time() - start)
            return result

        return wrapper


# 我的尝试运用如下:

def add(a, b):
    print(a + b)
    return a + b


R = Record(print)
R(add)(1, 2)
请先 登录 后评论

1 个回答

AI君

正确的写法应该是这样:

from functools import wraps
from time import time


class Record(object):
    """自定义装饰器类(通过__call__魔术方法使得对象可以当成函数调用)"""

    def __init__(self, output):
        self.output = output

    def __call__(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            start = time()
            result = func(*args, **kwargs)
            self.output(func.__name__, time() - start)
            return result

        return wrapper


# 我的尝试运用如下:

def add(a, b):
    print(a + b)
    return a + b


R = Record(print)
R(add)(1, 2)

----明天以后

请先 登录 后评论

相似问题