00:00
好了,同学们大家好,那么这一小节我们继续为大家讲解装饰器的内容,在上一小节呢,我们已经带领大家学习到了装饰器的基本语法,也就是第四步,对不对?那么这节我们继续来学习下一步的内容,为我们的装饰器进行一下完善,好了,把这第四步我们也进行一下注释,好不好来注释一下。然后把后面的内容也进行一下注释,下面为大家来讲解一下第五步啊来第五步后,第五步该讲什么内容呢?我们为什么呢?基本函数添加我们的返回值和我们的参数,也就说让我们的基本函数变得更加复杂,看装饰器该怎么来处理,首先呢,来定义基本函数啊,定义基本函数,比如说我们在这里边定义的函数还叫love啊,还叫love套上括好然后呢,我们先来处理一下什么呢?返回值的问题好不好?我们先来看一下给这个函数加返回值该怎么做?返回值的问题非常简单,首先print逃上括号,我们原有内容叫做亲亲,对不对?然后返回什么呢?Return,我们可以返回一些其他的信息,比如说我们会返回一个什么呢?爱心啊,比如说返回一个爱心,你能返回这玩意儿吗?还真可以啊,比如说我们返回一个爱心,那么基本函数定义完了,为了让我们的基本函数得到功能扩展,所以我们在这里干什么事呢?
01:21
啊,需要定义一个装饰器对不对,来,或者叫定义装饰函数啊,装饰函数来D我们的装饰函数de Co啊,Co,然后套上括号,然后呢,Pass一下,让装饰器来装饰我们的基本函数的语法已经学过了,At,我们的装饰函数是不是可以了,De CU,好,然后呢,装饰完了之后呢,我们会把love传到这里边,所以需要一个参数来接受一下我们的是吧,需要接受一下我们的这个原有的基本函数,所以FUC接收的就是love了,因为这一步它就相当于什么,是不是love等于de Co超生括号把拉号传进去啊是不是,所以这个原则大家千万不要忘了啊,这个这个原则,然后呢,接下来那在这里边要进行装饰的话,按照我们第四步已经学到内容,这里边必须要定义一个内部函数啊,定义一个内部函数啊,然后呢,我们一般情况下叫做inner啊df inner,然后呢,这个。
02:21
这波函数里边要实现未来的拉函数对不对,所以这里边有有增加,有增加的功能,有基本功能调用啊增加的功能,然后呢,有。基本功能啊,就是原有功能啊,基本功能,然后还有增加的功能啊,增加的功能加几个没什么限制的啊,好了,那在这里边基本功能调用没什么难度,直接f func括号就可以了,因为在这里边UC是不是已经接收到love函数就传入了是不是,那增加的功能咱还可以正常的输出啊,比如说print进行一个叫做报报是不是。然后呢,增加的功能,第二个我们也来一个举高高,和上面没什么区别啊,举高高。
03:06
好了,然后呢,别忘了在最后干什么呀,返回内部函数来在里边我们return一下我们的inner,这样的话,我们的love,未来的这个love是不是就是接触到inner了,是不是,所以我们的双十器就完成了,很多说这个能不能用呢?能用但是有问题啊,来调用函数。调用函数很多时候问题在哪?我们看看就知道。首先调用love函数,大家看到的输出不会有任何变化,依然是三个抱抱亲亲举高高,对不对?但是什么呢?结果没了,我们原来的love函数明显能看到有返回值吧,但是你看我这次拿一个变量接收love函数的返回值,你会发现。他没有返回值,返回值是呢。是不是法知道为什么会发生这种情况呢?那么你就要逆向来查找呢,我们现在定的love函数是谁?是不是我们在装饰器里边定义的这个inner啊,对不对,但是你发现了这个因ner里边根本就没有返回值嘛,是不是?所以你调用没有返回值也很正常,但是呢,由于基本函数是存在返回值的,所以我们必须保证这个返回值,哎,装饰之后还得存在是不是,那怎么办呢?好,我们可以这样做,首先呢,在我们的调用基本功能的时候呢,在这里边设置一个变量啊,设置一个变量干什么事呢?这样的话,调用ffa,这个f fac括号是不是相当于调用了谁?我们的love是不是?
04:32
它是相当于调用了love。调用了love好,调用了love之后呢?Love是不是返回值?哎,它返回一个小红心会被我们的VR收到,那么这个时候我们就可以在因的里边返回它,是不是就可以了,所以在这个内部函数当中,我们继续要返回一个值,什么值呢?这个值注意看好了,是原有函数或者叫原有基本函数的返回值啊。
05:06
那在里边return一下我们的什么呀,VR就可以了,那么大家请看那。Func调用的时候其实就是执行love,是不是love的结果,Take星星会被我们的VR收到,那么我们收到了之后,什么再把它作为inner的返回值是不就可以了?那么未来调用love的时候就调inner嘛,那这个时候我们是不是就把它的返回值也传承了下去,大家可以看啊,又见运行一次,这一次不再神上,而是红心出来了,看见了吗?而且你调用几次都可以啊。这样的话,我们的返回值问题就得以解决了,也就说白了,它不但基本函数有返回值,我未来的函数也要跟基本函数一样,明白了吗?看是不是都出来了,这也是装饰器的一个原则啊,你不能说装饰装饰人,装饰到最后把人给变了,是不是我这一个人,你装饰装饰给人装饰成一只猴子了,那这就不科学了吧,是不是?
06:04
好,所以这是我们的第五步当中返回值的处理方式啊,返回值的处理方式。其实就很简单嘛,接触到原有函数执行的时候返回值,再给它返回次数就可以了,但是大家千万注意啊,由于我们这个装饰器里边的返回或者内函数是一层套一层的,所以缩进千万不要出现异常啊,你看我的缩进都是写的非常规范的啊。好了,那这样的话,第五步的返回值处理完了,是不是还有参数问题啊,是不是,那如果我们的基本函数是有参数的,那又该怎么处理呢?好,我们把这一步给它注释掉啊,我用双引号啊。给它注射掉,我们再看一下,如果原有函数它带参数,我又该怎么解决它的问题?好,在这里边啊,我们来看一下叫做参数的处理方式啊,好,那么老规矩,先定义我们的基本函数,定义基本函数。
07:04
来DF啊,我们写上还叫love上括号。DF啊lo考生括号,然后呢,在里边print一下啊,我们写上一个叫做亲亲是不是,然后呢,给它加一个套数,就是谁亲谁行不行,比如说我们在里边互一逗号负二,我这里有两个参数了嘛,对不对,那么在输出的时候,我可以用上这两个参数啊,比如说啊,在这里边我们可以套上括号。好上括号,然后点ma啊。好,我们在里边给它参数使用一下好不好?来在里边套上括号啊,比for MAT套上括号,写上负一啊,逗号负二,那么这个时候我们在输出的时候大就会发现啊,它就会告诉你谁亲亲谁,然后是不是没事啊,然后呢,基本函数调用一下,先给大家看一下行不行,先调用基本函数啊,调用函数,那么love,由于函数中是带有参数的,所以你得写上去是不是,比如说我们写上妈妈,写上一个啊,第一个参数写上一个妈妈,然后第二个参数写上一个啊女儿,那么我们运行程序的结果你会发现是这样的啊什么呀,妈妈亲亲女儿对不对,好,没有问题。
08:19
然后呢,继续来做啊,把这个项注释掉,我们要对它进行装饰,那怎么办呢?在这里边就要加一个装饰函数了,好来定义装饰函数,好定义装饰函数DEF,我们的DC套上括号。然后呢,Pass一下,然后为了让我们的什么装饰器能够装饰这个函数,所以在里面加一个语法叫做at de,然后它的相当于什么呀?是不是相当于love?等于de Co考上框,写上love,是不是这是它的一个等价的一个语法?好,那这步操作完了之后呢,我们就在里边加参数了,因为装饰器要接收你一个函数,所以我们这边加一个f func,好,因为未来要什么呀,要这个返回一个函数,所以在里边定义内部函数啊,定义内部函数这个跟之前都是一样的dfin呢,好上括号。
09:14
然后呢,在里边啊,增强功能是不是增加功能一,增加功能二可以往里加啊增加功能一啊,然后呢,基本调用基本函数啊调用。基本功能,然后呢,增加功能二啊,增加功能二。增加功能二,然后呢,在这里边啊,我们别忘了最后还得什么呀,是不是还得返回内部函数一的呀。内部函数inner,因为它是未来的什么呀?是未来的love函数嘛,是不是love函数,所以在什么呀,我们的inner,好,当然这里还没有实现完啊,基本功能增加啊,咱还是老规矩啊,增加的第一个功能就是一个简单的输出print套上框,我们写上一个报报。
10:02
包包,然后呢基本功能调用,哎e func加上括号,然后呢调用增加了这个功能二啊friend举高高。好,我们写上啊,举高高OK,然后呢,装饰的步骤就算完成了,然后大家会来看一下我们能不能调用这个函数呢?答案是不行。因为大家也知道经过装饰之后,这个love就是什么呀,就是不是就是inner啊,是不是行没有问题,然后呢,你会发现inner是没有参数的,那么调用的时候我们不能给参数啊好。来这一边没有参数,右键运行程序运上去你会发现报错了,他说love缺两个参数,互一和互二,这是为什么呢?哎,问题来了,你看好了,Love在调用的时候,实际上执行的inner,这个没有问题,对不对?但是执行in的时候,第一步没有问题,第二步执行C的时候就相当于执行love,而它有两个行参,这个FC是不是相当于什么呀?要用好要相当于。
11:07
调用我们的谁是不是,调用我们的love是不是,但是你会发现love是有两个参数的,但是你又没给他传任何实参,所以自然会报错了,现在报的错误也正是这个错误啊,报的错也正这个错误。所以为了解决这个问题,怎么办呢?好,那既然原来love函数有两个参数,那么我们未来love函数依然要有两个参数。依然有两个参数,那么在这里边啊,我们把它女儿这两个参数给他送回去好不好?Love把这两个参数给他送回去,第一个是妈妈啊,第二个是逗号写上女儿。好,然后右键运行程序行了吗?不行,这次更直接告诉你,因的参数是不对呀,他有零个行参,但是有两个十参,其实问题很简单的呀,你这两个参数传进去总得什么呀。
12:02
总得有人收吧,因呢就是为了咱俩次收吧,所以在里边我们可以定义两个参数来接收你刚刚传入的妈妈和女儿,那么这个时候呢,我们在这里边啊,定一个W1啊W1这里边定一个W2,好,那么在调用love的时候,妈妈就会传给。W1女儿就传改W2对不对,然后呢,第一行增加功能执行没有问题,好执行FNC的时候相当于调用love嘛,Love是不是刚好需要两个参数啊,是不是好没有问题,我有两个参数给他,就谁呢?就是W1和W2。也就是说W一会传给我们的互一,W2会传给互二,然后再带到函数love当中执行,啊,右键运行程序,大家可以发现没有问题,增加功能是不是成功啦,然后你的参数是不是也记能下来了,实际上这个就是采用了什么呀,参数的多一层传递,你love执行的是inner,那么它的参数就会传给inner的参数,Inner里边又执行了原有的基本函数love,那么we和W是不是又传给了什么呀?那我来使用了是不是?这样一来,关于我们参数的问题和返回值的问题就给大家介绍完了。
我来说两句