Python基础 _ 装饰器

装饰器

    装饰器就是先封装一个功能函数,像钢铁侠的衣服一样,需要的时候直接套上,就可以使用它的功能了。当然这个衣服是随时可以根据改进的。 

    运用场景:1. 引⼊⽇志

                     2. 函数执⾏时间统计

                     3. 执⾏函数前预备处理
                      4. 执⾏函数后清理功能
                      5. 权限校验等场景

                      6. 缓存等等等等等

    基础版实现代码:

import time

# 封装计时函数,放一个参数,来传入外部函数
'''钢铁侠的皮'''
def time_spend(func):
    ''' 定义取到外部函数时执行的操作:
        1、调用time函数,分别设开始时间,结束时间
        2、调用外部函数,放在俩时间点中间
        3、打印耗时
        4、返回响应执行操作的函数
    '''
    def call_func(*args,**kwargs):
        start_time = time.time()
        func()
        end_time = time.time()
        print('耗时: %.5f' % (end_time-start_time))
    return call_func

'''钢铁侠本侠'''
@time_spend
def num():
    for i in range(1000):
        print('小可爱')
# 调用函数
num()

运行结果:
...
小可爱
小可爱
耗时: 0.04397
这就是一个简单的计时函数的运用。此时被装饰的函数是无参函数。(这里的装饰器和被装饰的函数都是
无参的)

可以理解为,计时函数好比是衣服 , 有需要的人只要在头顶加一个@路由 指引衣柜的位置,直接去穿这身儿衣服就行。


 升级版实现代码:

        1 、 被装饰函数传参

我们都用上面的代码,好对比

import time

'''钢铁侠的皮'''
def time_spend(func):
    # 2  为了防止被装饰函数传入不定长的参数,还得重复修改,
    #  干脆一开始就使用形参:*args,**kwargs,随便传
    def call_func(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)
        end_time = time.time()
        print('耗时: %.12f' % (end_time-start_time))
    return call_func

'''钢铁侠本侠'''
@time_spend
# 1 带参的被装饰函数
def num(a,b):
    for i in range(b):
        print(a+i)

# 3 调用函数并传参
num(1000,100)
运行结果:
...
1098
1099
耗时: 0.00099
 
 

三个小改动, num变成了带参函数~~~

1  带参的被装饰函数

2  装饰器中:为了防止被装饰函数传入不定长的参数,还得重复修改, 干脆一开始就使用形参:*args,**kwargs, 随便传什么参数

3  由于函数带参数, 调用时,我们输俩数字做测试

小小小小总结: 带参的函数~  就是在调用的时候,需要传参(emm不用装饰器调用时也得传,这里是废话没错),需要注意的是在接收参数的地方设置形参,后续装饰器用起来就不用重复修改了 。 装饰器内调用函数func(*args,**kwargs)当然也需要形参了

    2、 装饰器传参


猜你喜欢

转载自blog.csdn.net/weixin_42371158/article/details/80564925