码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器

时间:2021-03-29 11:52:53      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:执行   time模块   wrap   wrapper   方式   test   rgs   rap   return   

装饰器

定义:是在不改变函数的调用方式,还能为此函数前后添加功能

  • 装饰器的形成过程
一、写一个测试代码时间的函数
import time#导入time模块是为了模拟函数运行时间
def inner():
    start=time.time()
    time.sleep(1)
    for i in range(100):
        print(i)
    end=time.time()
    print(end)
inner()

二、当有多个封装成函数的代码需要测试执行时间时,一个一个重新写,太麻烦了
此时我们可以通过test()函数来传入函数名,来测试每个函数的执行时间,
我们称test()为装饰器函数,func()为被装饰函数
import time
def func():
    time.sleep(1)
    for i in range(200):
        print(i)
def test(f):
    def inner():
        start=time.time()
        f()
        end=time.time()
        print(end-start)
    return inner
func=test(func)
func()

三、语法糖
import time
def test(f):
    def inner():
        start=time.time()
        f()
        end=time.time()
        print(end-start)
    return inner
@test#语法糖,相当于func=test(func)
def func():
    time.sleep(1)
    for i in range(100):
        print(i)
func()
  • 被装饰函数带返回值
import time
def test(f):
    def inner():
        start=time.time()
        ret=f()
        end=time.time()
        print(end-start)
        return ret
    return inner
@test
def func():
    time.sleep(1)
    print(‘123‘)
    return ‘close‘
ret=func()
print(ret)

  • 被装饰的函数带参数
import time
def test():
    def inner():
        start=time.time()
        ret=func(*args,**kwargs)
        end=time.time()
        print(end-start)
        return ret
    return inner
@test
def func(a,b):
    time.sleep(1)
    print(‘in func() get:%s,%s‘%(a,b))
func(‘参数1‘,‘参数2‘)
  • 装饰器的固定结构
def wrapper(func):
    def inner(*args,**kwargs):
        ‘‘‘执行函数前要执行的功能‘‘‘
        ret=func(*args,**kwargs)
        ‘‘‘执行函数后要执行的功能‘‘‘
        return ret
    return inner
  • 一次性取消所有函数的同一装饰器
#这样通过修改装饰器函数前面的flag的值,就可以控制下面的函数是否都使用装饰器
flag=True
def timmer_out(flag):
    def timmer(func):
        def inner(*args,**kwargs):
            if flag:
                print(‘执行函数前要执行的功能‘)
                ret=func(*args,**kwargs)
                print(‘执行函数后要执行的功能‘)
                return ret
            else:
                ret=func(*args,**kwargs)
                return ret
        return inner
    return timmer

@timmer_out(flag)
def func1():
    print(‘我是一个登陆函数‘)
    return ‘我是登陆函数的返回值‘
ret=func1()
print(ret)  

import time
@timmer_out
def func2(flag):
    time.sleep(1)
    print(‘我是一个注册函数‘)
    return ‘我是注册函数的返回值‘
ret1=func2()
print(func2)

装饰器

标签:执行   time模块   wrap   wrapper   方式   test   rgs   rap   return   

原文地址:https://www.cnblogs.com/peng-blogs/p/14583884.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!