python使用类作为装饰器

1、普通就是一个函数作为装饰器,也可以用类名作为装饰器。

因为类和函数都是callable的,都可以使用括号来调用运行他。

2、上上篇的缓存一段时间的还是函数作为装饰器,类只是充当了比模块更下一级的命名空间,因为我的模块很大,不想搞很多模块级全局变量,所以用了class外壳。

正宗的类装饰器是这样

from functools import update_wrapper
class Deco:
    """
    Deco 的document
    """

    def __init__(self,func):
        self._func = func
        self._func_name = func.__name__
        update_wrapper(self, self._func)

    def __call__(self):
        print('啦啦啦德玛西亚')
        return self._func,self._func_name,self._func()




@Deco
def f1():
    """
    f1 的document
    :return:
    """
    return 'hello world'
print(f1)
print(f1.__doc__)
print (f1())

结果是这样

好处是相比于函数装饰器少了闭包,缺点是函数行为变了,但函数签名没有完全变过来,这样运行后函数成了装饰器类的一个实例了。

使用类作为装饰器来装饰一个函数和使用函数作为装饰器来装饰一个类是不同的概念。

函数装饰器来装饰一个类,也写过了  https://www.cnblogs.com/ydf0509/p/9211521.html

原文地址:https://www.cnblogs.com/ydf0509/p/9353714.html