装饰器学习总结

先看一个例子,知道一个概念。

在这里插入图片描述
我两次定义了test函数最后只执行一次test(),最终的结果如上图所示。
这个现象叫做函数重写。
但是这里想要说明的重点是:
python中函数比如这里的test()
你可以拆开来看 test + (),test表示函数名,它是一个指向函数在内存中首地址的指针。(不知道可不可以这么说)
()则是代表运行函数的符号。所以当你要调用一个函数的时候如果只写了函数名test却没写()这个函数是不会执行函数体的。
再来分析这张图:
我们第一次定义了一个test函数,那么test就指向【红色箭头】了红色方框【可以看做内存中的一片地址】,里面存放了函数体print(‘hello’)。如果这是时候【不考虑下面定义的test】使用test(),那么结果肯定是hello。但是我们又在下面第二次定义了test函数,因为test只能同一时间指向一个方框,那么之前的红色箭头就会被绿色箭头代替,这是test就指向了蓝色方框里面的函数体就是print(‘world’),此时再运行test()结果就是world了。

记住上面的分析和结果【就是test最终指向了谁?】,在之下的装饰器中会经常用到这个结论。

什么是装饰器?(标识性符号@)

装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。相对于其它方式,装饰器语法简单,代码可读性高。因此,装饰器在Python项目中有广泛的应用。

装饰器最早在Python 2.5中出现,它最初被用于加工函数和方法这样的可调用对象(callable object,这样的对象定义有call方法)。在Python 2.6以及之后的Python版本中,装饰器被进一步用于加工类

为什么要用装饰器?、

1,避免写冗余的代码
2,可以在不更改原代码的情况下,对代码增加功能。因为一般项目中都要遵守开放封闭原则,就是原来的代码最后不要动而是通过增加代码来实现对原来功能的增加改良等等。

装饰器的几种形式以及执行的顺序

1.对不带参数的函数进行装饰(最基本的):

在这里插入图片描述
所以此时再执行f1()这句话的时候,其实是先执行inner,再在inner里面执行func,由func调用print(‘f1’)。
看起来就像f1毫无变化就实现了别的功能!!!

上面绿色方框里面提到了一个新的概念“闭包”,什么是闭包呢?
闭包实质就是函数嵌套,并且函数里面的函数用到了外面一层函数的变量。

这里我们在函数oueter内又定义了一个inner()函数,并且inner()函数里面用到了outer函数的变量func。

需要注意的是outer函数最后一行的return inner这句话,这句话一定要写,它让你运行outer函数的时候返回inner函数的引用,然后你才能继续使用inner函数。

2.对带参数的函数进行装饰:

理解了第一种这一种也是很简单的。
在这里插入图片描述

上面这个的局限性就是函数的参数个数固定死了,不能多不能少,然而实际项目肯定不合适。同时又是函数还有返回值,这个你也不能遗漏,所以对上图的函数进一步修改。

 这时候就要用*args和**kwargs来帮忙了,`我这里当初没使用*kwargs只用了*args`

代码如下:

3.对带不定长参数和返回值的函数以及带参数的@的装饰:

在这里插入图片描述

4.一个函数上有两个@

在这里插入图片描述

5.类装饰器

在这里插入图片描述
类装饰器同理

@等效 fx1=Lei(fx1)
但是要调用的话一定要定义__call__方法,同时,self.fx1后面一定要加括号!!!!!!

否则:
在这里插入图片描述

目前就这么多了。 继续学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值