花里胡哨的装饰器

千万别被名字给吓到了,什么叫做装饰器?
顾名思义,就是给另一个函数进行装饰用的,简单说就是给别的函数添加额外的功能。
注意,装饰器的本质就是一个函数。
装饰器 = 高阶函数 + 函数嵌套 + 闭包
一、高阶函数
满足如下两个条件任何一个就属于高阶函数:
(1)函数的参数是一个函数
(2)函数的返回值是一个函数

直接上例子吧:
1> 函数的参数是一个函数

def result():
    print('this is a test')
def test(func):
    print('abc')

res = test(result)
print(res)
输出结果:
abc
None

2>函数的返回值是一个函数

def func():
    return 'this is a test'

def test():
     print('abc')
     return func
res = test()
print(res())
输出结果:
abc
this is a test

二、函数嵌套

def test():
    pass
    def test1():
        pass
         def test2():
              pass
上面这段代码就属于函数嵌套

三、闭包
所谓闭包听起来似乎不知所云,其实就是函数的作用域。

def test():
    pass
    def test1():
        name = 'jack'
        pass
         def test2():
              name = 'lucy'
              pass

上面这段代码中test2整个函数是一个包,test1整个函数是一个包,test整个函数是最外层的一个包。闭包可以理解为比如name = 'lucy'
这个变量只存在于test2这个包里。

四、装饰器的特点
(1)不能改变被装饰函数的源代码
(2)不能改变被装饰函数的调用方式

下面写个装饰器,自己体会。别问为什么,我不知道该怎么解释,就这么用就对了。运用之妙,存乎一心,用多了自然了然。

  • 写个需求,给函数test()增加一个判断函数执行耗时的功能,并且把给test()函数传参数<参数是可变长,不一定是几个,也不一定是什么形式,比如列表,字典都可以,加上人名和年龄。
点击查看代码
import time
def timmer(func):
    def warpper(*args,**kwargs):
          start_time = time.time()
          res = func(*args,**kwargs)
          end_time = time.time()
          print('此次使用函数的人是%s,年龄是%s岁' %(args))
          print('执行函数一共耗时%s' %(end_time-start_time))
          return res
    return warpper

@timmer --这里的意思是 test = timmer(test)
def test(*args,**kwargs):
    time.sleep(2)
    print('this is test')
    return 'ok'

result = test('jack',20)
print(result)
输出结果:
this is test
此次使用函数的人是jack,年龄是20岁
执行函数一共耗时2.009286642074585
ok
posted @ 2024-07-04 14:07  派森马  阅读(1)  评论(0编辑  收藏  举报