Python装饰器16-正确使用装饰器类

2019-06-16  本文已影响0人  dnsir

在Python装饰器15的章节中提到使用类作为装饰器之后,函数的属性发生变化,在之前是使用@wrap(func),同理使用类作为装饰器也有类似的方法的来实现。

正确使用类作为装饰器


from functools import wraps

class Profiled:

    def __init__(self, func):
        wraps(func)(self)
        # self.func = func

    def __call__(self, *args, **kwargs):
        print("call")
        return self.__wrapped__(*args, **kwargs)
    
@Profiled
def add(x, y):
    return x + y

print(add.__name__)
result = add(1, 2)
print(result)

执行结果:

add
call
3

发现结果是预期的了。
根据Python官网文档, wraps(func)(self)本质是为类实例增加一个__wrapped__作为类实例属性,所以self.__wrapped__本质就是add函数。

小结

现在我们已经会将类作为装饰器正确使用了,似乎定义了__call__方法就什么问题就解决了,那么真的是如此吗?

上一篇 下一篇

猜你喜欢

热点阅读