装饰器,wrap、inner

用于在不修改原函数代码的情况下增强其功能。以下是 10 个最常用的装饰器用法,涵盖函数增强、参数检查、缓存、日志、权限控制等场景

1.原函数 lunch(),加上面装饰器,@my_wrap
2.装饰器函数my_wrap(),里面传参就是原函数,参数命名可以随意,目前func,作用:负责接收原函数并返回包装后的函数。
3.再定义一个wrap()函数,实现了装饰器的核心功能(包裹原函数并添加逻辑)

def my_wrap(func):
    def wrap(aaa):
        print("午餐开始啦")
        func(aaa)
        print("午餐结束啦")
    return wrap

@my_wrap
def lunch(food):
    print("午餐是:",food)

lunch("noodle")

如果原函数传参为2个,则优化代码
如果引用装饰器的原函数有1个或多个参数,为适配,装饰器函数传参可以使用万能传参(*wargs,**kwargs)

def my_wrap(func):
    def wrap(aaa,bbb):
        print("午餐开始啦")
        func(aaa,bbb)
        print("午餐结束啦")
    return wrap

@my_wrap
def lunch(food,exit):
    print("午餐是:",food,exit)

lunch("noodle","rice")
def my_wrap(func):
    def wrap(*wargs,**kwargs):
        print("午餐开始啦")
        func(*wargs,**kwargs)
        print("午餐结束啦")
    return wrap

@my_wrap
def lunch(food,exit):
    print("午餐是:",food,exit)

lunch("noodle","rice")

打印结果:
午餐开始啦
午餐是: noodle rice
午餐结束啦

原函数,引用多个装饰器

import time

def my_wrap(func):
    def wrap(*wargs,**kwargs):
        print("午餐开始啦")
        func(*wargs,**kwargs)
        print("午餐结束啦")
    return wrap

def timer(func):
    def wrap(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print("执行耗时: ",end - start)
        return result
    return wrap

@my_wrap
@timer
def lunch(food,exit):
    print("午餐是:",food,exit)

lunch("noodle","rice")

打印结果:
午餐开始啦
午餐是: noodle rice
执行耗时: 0.0
午餐结束啦

posted @ 2025-06-06 15:20  呆呆酱  阅读(69)  评论(0)    收藏  举报