装饰器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

装饰器:

定义:本质是一个函数,装饰其他的函数,就是为其他函数添加附加功能。

原则:1.不能修改被装饰的函数的源代码

           2.不能修改被装饰的函数的调用方式

实现装饰器的知识储备:

1.函数即“变量”

2.高阶函数

3.嵌套函数

高阶函数+嵌套函数=》装饰器

装饰器的一个例子:

import time

def timmer(func):

      def warpper(*args,**kwargs):

            start_time=time.time()

            func()

            stop_time=time.time()

            print(‘the func run time is %s‘%(stop_time-start_time))

       return warpper

@timmer

def test1():

      time.sleep(3)

      print(‘in the test1‘)

test1()

我们可以发现,timmer作为一个装饰器,其实没有改变test1的源代码和引用方式。就好比,我让一只猫变成一只狗了,但是猫并不知道他变成了一只狗。

第一部分:函数即变量

如何理解这一句话:

比如我令x=1,这时候就在内存里创建了一个小房子,小房子里面是1,这个房子的门牌号是x,之后引用的时候,找到门派号就可以了,当x被取消的时候,里面的1其实是不会被取消的,当刷新之后,1突然发现没人引用他了才取消。

同样,函数也是这个样子的,只不过门牌号变成了函数名,而1遍成了函数体也就是函数的逻辑。

比较下面2个代码:

第一个:

def foo():

       print(‘in the foo‘)

      bar()

def bar():

      print(‘in the foo‘)

foo()

这个代码就能运行成功,如何理解呢:他先定义了foo这个函数,定义完之后,后面两行代码就被当成字符串放在了foo这个小房子里面。然后定义了bar这个函数,后面的一行代买就被当成字符串放在bar这个小房子里面,因此运行最后一行foo时,都能找到对象。

第二个:

def foo():

      print(‘in the foo‘)

      bar()

foo()

def bar():

     print(‘in the bar‘)

这个代码就执行不了,会报错,因为执行到foo时找不到bar。

 

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python 装饰器:装饰器实例类装饰器(装饰函数)

装饰器、装饰器类与类装饰器(三)

Python进阶装饰器(Decorator)

python 装饰器:装饰器实例内置装饰器

python 装饰器:装饰器实例内置装饰器

TS之装饰器