00:00
好了,同学们大家好,那么这一小节为大家带来装饰器的语法,在这里边新建一个文本文件,右键新建一个文本文件啊,我们写上装饰器,那么学习装饰器之前,自然要了解装饰器是什么,对不对?其实装饰器很简单啊,它就是为了。什么呢,叫做增加。为了增加功能啊而对函数啊而对而对我们的函数或者类进行功能扩充的一种语法。简单的说就是什么呀,为了加功能呗,是不是,但是这个东西这话叫这个功能加了之后还是原来的一个函数,和原来各类现实生活中的与很多东西都非常与它非常的相似,那最简单,我们最常用的比如说手机吧,那我们有一个手机,大家知道手机里有操作系统,安卓也好啊,与谷歌也好啊,是不是安卓也好啊,苹果也好啊,但是你刚买的手机,它的功能就这些,那为了让我们的什么呀,手机的功能更多,是不是能录像啊,诶你可以加摄像头对不对,为了让他能够什么样聊天啊,你可以加一些语音软件对不对,为让他能够更加有趣,你可以加一些游戏,但是无论你怎么加之后,你会发现手机还是原来那个手机,但是手机的什么呀,应用范围呀,使用方式啊,是不是都给扩充了,对不对,那我们在现实生活中,比如说女孩子打败这正常情况下,一个女孩子在这里站着,但是你如果给她加上一些花蝴蝶呀,给她什么样化上妆啊,佩戴上的首饰啊,她会更加的漂亮,对不对,这也是宫的一种过充。
01:41
其实这就是装饰器,那么我们在北小节当中会用11步带领大家把装饰器的方方面面为大家讲解清楚好了,在这里边啊,我们新建一个文件啊,右键新建一个P文件啊,BC。Or to啊,好装饰器啊,来在这里边,那么我们来看一下第一步,第一步非常简单啊,就声明一个简单的函数啊,声明一个普通的函数就可以了,函数即可。好什么函数呢?比如说我们在里边声明一个函数叫做love,然后呢,函数的功能呢,我们用简单的一句话代替print,干什么事呢?我们函数的功能就是亲亲。
02:23
行不行,那么非常简单,定义一个love函数,这个函数的功能就是输出亲亲这两个字,那么我调用这个函数是否可以正常使用呢?来调用函数,我相信大家应该都知道完全没有问题的,是不是来调用函数?第一次框love右键运行一遍,那就会发现啊,轻轻数出了对不对,然后呢,我再次调一次函数啊,Love发上框能不能执行呢?右键执行一遍是不是也可以啊,所以这样的话。定义一个函数,你可以多次调用,完全没有问题,那么第一步就搞定了啊,当然第一步是我们为了扩充而定义的一个基本函数啊,好了,为了给我们的函数扩充功能,比如说我们干什么事呢?呃,在这个亲亲前面加上一个我们希望啊,在亲亲前面加上一些功能,在亲亲后面加上一些功能,可不可以呢?可以。
03:20
好,然后呢,这个时候我们进入第二步啊,第二步第二步。好,第二步干什么事呢?我们增加功能,那么怎么样增加功能呢?很多说,那我直接在这里边写行不行啊,这种方式想法是没有问题的,但是这样的话他少了几个问,有几个问题啊,第一个我们装饰器的重用性没有解决,第二,万一功能非常多或者非常不好加的话,那么实际上它通信也不好,所以为了让我们的函数能够增加功能,我们来做这样的一个操作,首先定义我们的函数love。
04:04
然后呢,原有内容我们依然进行输出,Print生框里边写上我们的近期啊。啊,请进,OK,然后呢,为了增加它的功能,我们怎么做呢?我们这样做啊,定义了一个专门的增加功能的函数啊,这个是我们的基本函数,我们在这里边定义增加功能的函数,好,这个函数DEF随便起名字,比如说我们叫它呃,De行不行?增加功能的函数好了,然后呢,Pass一下,那我需要用到这个增加功能的函数,让我的love变得更加什么呀,更加有其他的一些,就功能更加丰富,或者输出更加多等等等等,那我们怎么来实现这个操作呢?好,我们这样做。我们在这里边写了一句话啊,什么句话呢,叫love等于DC考生框love。
05:01
这里边是什么意思呢?其实就是我希望把love传到什么呀,De中,然后呢,让什么呢,让我们DEC产生的结果重新复制给love,是不是这个效果,然后这个时候呢,哎,就是一个参,叫做将函数啊,或者叫将基本函数作为参数啊,作为参数。我们传入装饰函数中,好就这步操作,那么能实现吗?现在肯定是不行,对不对,所以我们可以这样做啊,而且我们也没有加功能啊,加增加功能我们在这里写上啊,比如说增加功能一,然后呢增加功能二,增加功能二。好,然后呢,既然我们把love作为参数传到了bcr中,这里边是不是应该加上一个行参来接收啊?好,我们在里面加了一个行参,叫f func,意思就是de执行的时候呢,你可以把love传进去,是不是也说love传给了func,那么如果我希望调用调用基本函数的话,那在这里面直接什么f fun nc括号就可以了。
06:13
来,大家想一想,是不是那么回事啊,你看我们把love作为一个整体啊,传到decor中,Func接收到了你的love,其实就接受这个函数,那么这个时候FC其实就是你的love函数本身,对不对?然后我在里面调用FC,其实不是,是不是相当于调用love,是不是一个道理啊,就是相当于调用love啊。相当于调用love。调用love函数啊,有没有问题呢?其实没有问题的,然后呢,我还没完,我们不是要增加功能,我在原函数调用之前增加一个功能,比如说我们加一个什么呢?在里边加一个功能啊,增加了功能叫做抱抱好不好抱抱,然后呢,增加功能二,我们也加一个功能,Print框框。我们写上一个啊,叫做举高高,行不行,抱抱亲亲,举高高啊举高高。
07:06
举高高好,那么这个时候呢,我们其实就完成了一部分内容,那么大家来看一下,现在你看是不是整个操作有了,装饰的函数有了,基本函数有了,这是装饰的步骤,那么我们装饰完成了吗?调用函数才可以知道。好,调用函数在里边直接调用什么呢?调用love,也就是说需要注意啊,即使我们装饰完了之后,函数名不会发生任何变化,对不对?所以还得叫love,那这样我们装饰真的成功了吗?答案是没有。来右键运行一遍程序,你会发现,诶,好像是成功了,抱抱亲亲举高高亲期是基本函数,我们增加了报报和举高高,但是大家也发现他报错了,报了什么错误呢?说none不能被调用,None类型不能被调用。其实在这里边,即使你没有最后这步调用函数代码也会正常出现了,这三步是不是也会出现啊,原因是什么?原因是为刚刚这三个输出,实际上是这个函数执行的时候,就是DE1U函数执行的时候一个操作,你看在这里边啊,我先不管前面的赋值,我直接看de CU啊调用这个函数呗,那么程序会执行这个函数输出第一步print报报,所以。
08:22
得到了一个爆告输出,然后调用了我们传入的函数,那我们传入是落了,所以在这里边得到了一个轻轻,然后输出了一个举高高,也就说这一步其实就有一个三个输出了,但是这里边有个最大的缺陷就是什么呢?那最后收到的是什么?很多说love不是个函数吗?是你love之前确实是一个函数,但是经过装饰器这么装饰之后,你会发现love传进去之后,诶,最后的love反而变成了一个那。啊,LV,你会发现love是一个啊。看到没有,是不是一个,那么为什么呢?那通过这个语法大家能看出来啊,这明显就是调用函数,如果调用函数前面有等号操作的话,就是指什么呀,其实就是指我这个函数的返回值会复制给love,对不对,但是现在你会发现我们第二步操作中,它功能是增加了,但是没有返回值,所以love得到的结果是一个nu啊,所以你没法调用的,你看只是这步输出也是你刚刚这个什么呀,扩充功能的时候输出也不是love的一个输出啊,你在这边只要调用love,他一定会报错的。
09:32
因为love是一个那嘛,咱是不是看到了,是不是好,所以为了解决这个问题,我们开始进入第三步操作,把第二步给大家注释一下,第三步我们就要实现基本的装饰器。那么通过第二步这个操作啊,我们其实已经找到了第二步的问题所在,好,我们来看一下第三步啊,第三步叫做第三步。不呢,叫做基本的装饰器。
10:00
基本的重要式器好,那么这个时候呢,老规矩,先定义基本函数啊基本函数。好,基本函数DEF,我们还叫它love,请交,然后呢,我们在love当中输出一个星期,好星期,然后呢,为了让我们这个基本函数的功能得到增强和扩充,我们在外边又或者叫上面又新建了一个装饰器函数,啊,那这个函数de de Co行不行,画上括号,然后pass一下。那大家都知道啊,我们在这里边干什么事儿呢?在这里边啊,你要想让我们的装饰器蜡,呃,让我们基本上得到扩充,一定会把love传到我们的第一句话当中去,是不是?所以在这里边需要加上一句话什么呢?来就是。LV love等于CD Co套上括号,把love再传进去,意思就是love进去装饰了之后还得叫love,还得是个函数好了,那这样的话,你既然有函数传进去,我们再来写一个参数FNC接受一下好了,然后调用基本功能。
11:07
调用基本功能。调用基本功能,这个时候怎么调用呢?简单func就代表love,所以直接调用就可以了,然后呢。为了让我们的功能得到扩充,所以我们可以在这个什么基本功能函数前面加功能,后面加功能,是不是来功能增加功能一和增加功能二,好吧,增加功能一,我们在这里边依然输出一句话啊,叫做抱抱。我是宝宝啊,抱抱。然后呢,再调用基本功能之后,再加上一个啊,增加功能二。增加功能二,功能二啊,我们在里边print啊,举高高。与高高高高好了,那么这个时候呢,我们会发现现在的效果跟第二步是一样的啊,跟第二步是一样的,原因什么呢?Love受到的值依然是一个nu,也就是那你最终装饰器,你最终love送进去没有问题,但出来的love它已经不是个函数了,是一个空了,是不是啊,右键运行一遍,你可以发现love是一个now,这是不符合我们要求的,那我们知道love原来是一个函数,那最后是不是还得是一个函数,所以在这里边返回值啊,在这里边必须返回函数啊,必须返回函数,那么在里边return一个函数是不是就可以了,那这个函数其实是谁呀?其实就是你看love接受它的结果嘛,所以实际上,实际上我们其实就是什么呀,未来的love函数啊,未来的love函数。
12:42
好,那未来的love函数应该具备什么样的特征和功能呢?很简单,有基本的功能,也有扩充的功能,是不是?所以为了让我们love能够得到一个函数,我们在函数这个装置器函数里边声明一个内部函数,内部函数函数没问题,在de无所谓啊,DEF,比如说我们叫它inner。
13:05
那么这个时候干什么事呢?我们把刚刚扩充功能和调用基本功能全都放在inner当中,于是这里边你会发现in呢?成了一个内部函数,而这个一函数具备love的功能,也具备love扩展的功能,是不是?所以在里边我返回值的时候,只需要返回刚刚这个内部函数,因而即可。那么这个时候一个完整的装饰器就展现在大家面前了,大家来好好看一下它的运行过程啊,首先呢,我们先注释掉这个代码,那整个函数啊,有两个装饰器函数和我们的一个基本函数,然后下面是一个怎么样,这是一个装饰步骤啊,这是一个装饰步骤,装饰操作好那么在这里边大家看装饰操作是怎么完成的,首先呢,我在这里边调用DC函数,也就是我们装饰器的函数,对不对?好,那么把谁呢?把love作为一个十参传进来,好,13传输进来之后会被f func接收到,所以这个f func实际上就是love函数本身,对不对?然后呢,在这个装饰器函数当中,哎,我们定义了一个新的函数in the。
14:15
让因呢,干了什么事呢?调用了基本函数,因为f fec就拉我们调用了基本函数,同时在基本函数的外侧或者外部又增加了新的功能,那么最后组成了这个inner尔,然后在整个装饰器函数的最后,我返回这个inner,而返回inner是不是就返回这个内部函数一的函数啊,返回了之后你会发现啊,这个返回值是第二装饰性函数的,而刚好love接收到了它的返回值,所以未来的love一定是一个函数,因为未其实这个什么呀,Love就是这个里边的inner了是不是?所以装饰的过程就算完成了。装饰完了之后,你这个love就是里边这个inner,这个inner具备原有的基本功能,也具备扩展的功能,就实现了装饰器语法,那么这个时候我们再次打印love的时候,你会发现啊,它肯定是一个函数啊,右键运行一遍肯定是一个函数,看见没有肯定是一个函数,然后呢,如果你不调用的话,或者你不打印的话,它也不会有任何输出。
15:16
看见了吗?好,所以这个时候干什么事呢?你既然确定love已经是一个基本函数了啊,已经是一个函数,我们可以调用函数啊,好在这里边love括号啊,看好了LV括号。好,第一次调用啊,大家看我有没有实现基本功能,并且扩充功能,右键运行程序,大家会发现这是我们的原有的基本功能吧,是不是上面和下面是不是我们扩充的功能,你会发现,哎,Love函数由原来的只有一个,亲亲,现在是不是上面的扩展功能,下面也扩展的功能,是不是?那其实我们就完成了一个装饰器的操作,这就是装饰器的原理,大家看懂了吗?其中在装饰器这里边用到了非常非常多的什么前面的基本语法的一些内容,比如说我们的传参,比如说我们的内部函数,我们的返回值,这里边只要有一个基础知识不扎实,那么你一定看不懂装饰器。
16:17
所以大家在学习装置器的时候,一定要保证自己函数那一部分完全没有问题,否则的话,我不建议你来学习当前章节的内容。好了,那么第三部分我们的love啊,函数装饰完成了,而且love你想调用几次调用几次啊,你看我再调用一次,下面又会出一次调用,你看没一次调用是不是这是一次调用,这是两次调用啊,想调用三次也可以,其实我们就完成了装饰器了,咱这这是装饰器的一个基本原理,一次啊两侧。三次看见了吗?好,那么装饰器器完了吗?没有,这只是装饰器的原理,还没有达到真正装饰器的一个操作,所以给大家看第四步啊,真正的装饰器语法。
17:05
来在里边我们看一下第四步啊。第四步。我们要讲什么呢?叫做装饰器语法。其实装饰器语法和我们上面都是一个原理啊,只不过讲上面让你在学第四步会非常方便,首先定义基本函数啊定义。基本函数来EF,我们叫它love括号,然后在这里边输出啊,输出我们的抱抱啊,不对,是亲亲啊亲亲。好,然后呢,为了让我们的基本函数能够扩充功能,在上面我们定义了一个装饰器函数啊装饰器函数来D我们的DC好套上框,然后呢,在这里边pass一下。然后呢,注意啊,我们之前怎么进行装饰操作的呢?考了之前的装饰操作是这样完成装饰操作,我们这里边通过ECU调用把原有函数传进去,传进去之后经过装饰器函数操作返回值,我再用love接受一下,这是不是原来的操作,是不是好,那我们把装置器也给它补充完整,在这里边写上FC,用来接受你传入的love,然后为了让它扩充功能,并且能够返回值,所以在里边定义内部函数啊,定义内部函数。
18:26
然后呢,DF啊D。那么在这里边这个内部函数其实就什么呀,就是未来的,就是它就是未来的love函数啊,然后呢,在里边定义完了之后呢,哎,我们原有函数要干什么事,我们这个未来的函数要干什么事啊,要增加功能嘛,是不是增加功能一,然后还要让基本函数能够运行,所以它里边还有调用基本函数,然后还可以再增加功能啊,增加功能二,增加功能二,但是需要注意啊,并不是说只能加一个或者只能加两个啊,你可以加任意多个功能,只不过是我们为了让大家看起来更加有规律嘛,是不是前后都能加这个意思啊,好电影基本功能没什么好说的,F fun nc套上括号,因为参数是可以传递到内部函数当中去的,是不是这是我们的传递作用域列嘛,然后呢,然后干什么事能增加功能啊,一我们还是来一个叫做报抱啊print一个抱抱。
19:26
好,增加功能二,我们print来一个举高高,好来在里边写上一个举高高,OK,没有问题,然后呢,别忘了你这个音呢,是为了什么呀,当未来的音呢,未来的love函数的是不是,而未来的love一定是我们的装饰器函数的返回值,所以别忘了在这里边啊返回呃,内部函数,也就是说在里边return一下,Return我们的in。这里边写的时候千万注意啊,很多容易很多容人容易在里边加上括号啊,返回音的括号那就错了,如果你一旦加了括号,这表示返回什么呀,返回音的的结果,但是我们故是我们需要把整个inner返回回去,是不是当做我们love的值啊,所以这个返回的时候一定不能加括号啊,好做器写完了吗?写完了然后能不能运行呢?自然也是没有问题,来在这里边直接运行,不会有任何输出,然后呢,为了让我们的love函数可以执行,可以调用啊,哎,调用函数看好了,调用函数直接拉就可以了,来大家看一下。
20:27
右键运行一次,一次调用是没有问题,基本功能扩展功能好,然后呢,在这里边再调用一次,依然毫无问题。当然大家也看啊,这个其实和上个没什么区别嘛,是不是,所以这其实就是第三步的内容,那第三步咱说了要实现装饰器语法,装饰器有什么语法呢?注意看好了,装饰器的语法主要针对于装饰操作来进行了一个缩减,我们正常的装饰操作是不是这么来玩的?哎,拿出来啊,我们正常装饰操作是这样来玩的,就是通过一个呃,叫做函数调用和一个赋值操作,是不是?实际上啊,如果我们是希望干什么事呢?我们是希望让用就是love被我们的装饰器DC装饰的话,不需要那么费劲,把这部删除掉,然后在你需要装饰的函数前面加上一个at,然后指定一下你需要被装饰的那个,呃,指定一下那个装饰器就可以了。
21:26
那Co上啊,这样写完了之后就表示什么呢?就表示我de Co多了一个,这就表示我love函数要被什么呀,一个叫做第一细化的函数装饰,所以这个语法就等同于我们刚刚写的这一大堆啊,我们刚刚不是复制这大堆吗,是不是?它俩是完全相等的啊,这是装饰操作。看见没有,完全等价于这个操作。等价与这个操作完全没有任何区别,但是你会发现这语法是不是简单了,是不是好了,那大家还有疑问,就是这个语法能用不能用啊,是不是或者能不能实现呢?好在这里边我们调用函数就可以了,调用函数。
22:10
这个语法注意啊,它代替的就是这一步。然后呢,调用函数,那你看一下功能有没有得到扩充,好吧,先不调用,看一下有没有输出啊,你会发现没有扔,哎哎,这一步有输出哪不调用下边好用调用吧,啊在这呢。来先把这个我们不做,现在改了语法之后啊,我不调用任何内容,我运行一遍程序,你会发现没有任何输出,对不对,然后我想调用函数love,那就在这里边love好上括号,第一次调用。来得到一份结果,原有内容扩展功能是不是都可以啊,好,然后呢,再次调用函数。右键运行一遍。好,你会发现是不是又又出来一份新的,是不是这就表示我们的装饰器完成了啊,当然即使是这样,我们也是完成了装饰器的语法,就是告诉大家这个装饰语法是怎样使用的,还有很多边边角角的内容需要大家另外来考虑什么内容呢?比如说原有函数有返回值怎么办?原有函数有参数怎么办?
23:10
这就是我们什么一会儿要给大家介绍的内容,但是在此之前大家一定要把装饰器第三部搞得明明白白,好吧,好了,感谢大家收看本小节,我们下一小节继续为大家讲解装饰器。
我来说两句