【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 @   Tony_xiao  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示