【python】多层级装饰器与类装饰器

  • 当一个功能函数,我们添加了多个额外功能时,这是我们就要使用多层装饰器;多层装饰器使用时是按就就近原则
def makebold(fn):
    print('加载makebold')
    def wrapper():
        print('执行makebold中wrapper函数')
        return "<b>" + fn() + "</b>"
    return wrapper

def makeitalic(fn):
    print('加载makeitalic')
    def wrapper():
        print('执行makeitalic中wrapper函数')
        return "<i>" + fn() + "</i>"
    return wrapper

@makebold        #hello = makebold(wrapper)
@makeitalic      #wrapper = makeitalic(hello)
def hello():
    return "hello alvin"

print(hello())

执行结果
加载makeitalic
加载makebold
执行makebold中wrapper函数
执行makeitalic中wrapper函数
<b><i>hello alvin</i></b>
  • 再来看看类装饰器,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器还可以依靠类内部的__call__方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。
import time

class Foo(object):
    def __init__(self, func):
        self._func = func

    def __call__(self):
        start_time=time.time()
        self._func()
        end_time=time.time()
        print('spend %s'%(end_time-start_time))

@Foo  #bar=Foo(bar)
def bar():
    print ('bar')
    time.sleep(2)

bar()    #bar=Foo(bar)()>>>>>>>没有嵌套关系了,直接active Foo的 __call__方法
posted @ 2022-10-29 15:28  Tony_xiao  阅读(71)  评论(0编辑  收藏  举报