Python基础14——python装饰器

装饰器本质其实就是一个函数

我们在进行开发的过程中难免会遇到想要给之前已经写好的函数增加功能,但是如果直接对已经写好的函数进行修改可以会造成成片代码的修改,所以不建议这样,我们可以使用装饰器来对给我们的函数增加功能。

一、被装饰函数无参数



使用魔法糖对函数进行装饰:@fz对fx进行装饰(装饰器的语法要求)
@fz 等效于  fx = fz(fx)   其实一旦被装饰以后就相当于被装饰的函数对象作为装饰函数的参数,此时被装饰函数的调用转化为装饰函数的调用即fx的调用转化为fz的调用,然后fx对象作为参数传入fz中,在fz中再调用fx

二、被装饰函数有参数


这里注意参数添加的数量和位置都要准确

三、被装饰函数有不确定数量的参数



在不确定被装饰函数的参数数量时使用不定长参数和关键字参数,如上图所示,这样避免了去查找被装饰函数的个数,避免来回修改各个函数中的参数,同时这样的装饰函数可以用来装饰多个参数数量不同的函数,效率比较高


四、使用python自带的装饰器保护被装饰函数原来信息

因为一旦被装饰器进行装饰以后,被装饰函数就会指向装饰函数中的闭包函数,这样有可能会影响原被装饰函数的内容,所以通过使用python自带的装饰器保护被装饰函数原来信息,避免了装饰函数对被装饰函数的影响。
首先引入模块from functools import wraps     然后@wraps(参数名)来保护被装饰函数,因为这个参数名其实就是被装饰函数的名字


从上到下运行程序,到@fx时返回去运行fx()函数,且参数是fz,也就是@fx == fx(fz),然后再fx中返回的是fy函数,然后嗲用fy(),首先是print,然后是func()也就是fz(),也就是在调用fz,fz里打印这是在fz函数中。这就是整个代码的运行过程。

注意以后写装饰器直接就把保护装饰器带上。



五、类装饰器(Python自带的)

1、@property把方法变成属性并调用
通过which.score来调用score这个函数
注意property是给那些没有参数的函数用的,将没有参数的函数变成属性并通过点的方式进行调用



注意这时并不能通过赋值的形式进行修改,即which.score = 23不能修改属性值,会报错

但是可以在property下面通过另一个类装饰器对对象属性进行修改  那就是利用@函数名.setter来装饰一个已经利用@property转化为属性的方法的同名方法,然后在同名方法里进行属性的修改,代码如下:

这样就可以实现对象属性的修改,相当于which.score=80这个赋值操作的时候就调用下面的score方法。@score.setter是依靠@property存在的,其实property下面还有getter方法,但是其实getter方法就相当于是property那个部分了,所以几乎不会用到getter

2、staticmethod静态方法,将类内的方法变成一个普通方法,通过对象名或类名。方法名进行调用,否则类内方法只能通过对象名。方法名进行调用而不能通过类名。对象名进行调用。静态方法的参数的第一个参数并不指向类对象了,而是就是一个普通的参数,也就是说静态方法与对象无关,只与类有关。因为静态方法的参数与对象无关,所以静态方法的参数不用非得和构造函数的参数一致,因为它就是一个普通方法,只是命名空间在类内,但是它并不受类对象的影响,所以静态方法的参数只由其本身决定。


3、classmethod
使用@classmethod将函数装饰成类函数,类函数的第一个参数一般用cls表示,它表示的含义是函数所处类的名字,目前也只是了解,具体用处之后再来补充


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值