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,但是没有输出装饰器内容,并没有预想的计时器输出

阅读 2k
1 个回答

正确的写法应该是这样:

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. 首先,R = Record(print) ,R现在是一个类实例,同时他实现了 __call__函数,也就是他可以当函数调用。
  2. 那么。R()是没有问题的,把他当做是一个装饰器,那么他需要传递一个函数进去,也就是 R(add)。
  3. 然后,你看__call__返回的是啥,是wrapper,是一个函数,同时他还需要参数,也就是 R(add)(args, *kwargs) 你需要去调用他才行。
  4. 由于add只需要两个参数,所以R(add)(1, 2)。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题