00:00
同学们大家好,那么这一小节开始,我们就要可以把我们的装饰器讲解完了,用我们的装饰器还剩最后三步好了,拿开我们的文件来写下我们的第九步好不好?来,我们在第九步。第九步,我们要做什么操作呢?我们要做一个比较难的操作,就是将类作为装饰器啊,能看懂什么意思吗?简单的说哈,我们从来都没有说装饰器它只能是函数,实际上装饰器它也可以使用类来制作的,所以其实我们就要做一个什么呀,用类做装饰器,就这么意思啊,用泪做装饰器。那么用类怎么来做装饰器呢?那么我们就要对原有的装饰器进行一下分析,然后使用的时候来看一下好了,我们在里边先写原有装系好不好,写一个基本函数啊,基本函数,基本函数呢,我们还叫它love,放上括号,然后呢,在这里边输出啊,我们写上亲亲,然后呢,为了让我们这个函数可以扩展功能,对不对,所以我们在这边定义一个装饰器啊,定义装饰器,那么定义装饰器最复杂的情况我们已经学过了,无非就是什么呀,有一个装饰器外层,是不是装饰器外层,然后里边有一个装饰器,然后装饰器里边有一个什么呀,返回函数,这是最复杂的三层方式。
01:23
那么我们就给大家写这种方式好不好,那装饰器外层咱定义为D,写上out out out,然后呢,装饰器内部啊,装饰器这一块呢,我们要写什么呢?装饰器本身啊,第1CU啊,当然写了之后你别忘了返回啊,因为装饰器一定要返回才可以用啊,来写下pass。把这个先注释掉啊,我们写上pass,别忘了在最后面要返回装饰器本身是不是out里边返回啊,返回装饰器,那么在里边return我们的de CU,然后呢,接下来。
02:01
那么在这里边啊,我们的这个装饰器里边是不是可以要定义装饰器内部啊,哪哪去了啊,弄丢了啊,叫做内部函数,我们定义为一个inner din,这个缩紧不太对啊。然后呢,套上括号,然后呢,当然定义完in的之后呢,你也别忘了返回我们的n in的函数,所以这边给大家一个return in好搞定。然后呢,如果想加一些功能,比如说我们希望传参数,是不是使用的时候,你可以在这里边at alter,然后随便传一个参数啊,用不用再说你可以随便传一个参数,比如说传一个就是传一个叫做I行不行,那么在这里边需要参数来接收,当然你要写多个参数,上面也可以写多个形参来接收的,然后这里边内部函数来进行操作的时候,无非就是基本函数调用啊,基本函数调用,然后呢,在这里边增加功能对不对?好增加功能,然后呢,下面增加功能二,增加功能二。
03:07
好,来调用基本函数,那么我一定是会把这个love传到装饰器这块,所以我们写个f func来接收一下好不好?然后呢,在这里边基本函数调用直接是func括号就可以了,使用fun括号,然后增加功能的时候,我们在里边直接输出啊print套上括,我们写上报包。然后增加功能二这块,我们写上一个举高高,来print套上括号,我们写上高高啊举高高好了,这样一来的话,一个相对来说比较完整的装置器就已经写完了,对不对?那它能使用吗?来我们调用一下函数啊,调用函数直接落括号,看有没有装饰成功是不是就可以了,哎,右键运行几遍,大家会发现是不是装饰成功了,当然哈,这里边这个参数我们没怎么用啊,我们没怎么用。当然你要想用的话也可以使用啊。好了,来,我们继续来做,下面我们干什么事呢?我们要把这个装饰器使用类来表示,刚刚做到的是一个什么呢?注意看好了,你刚刚只是定义了一个函数板装置器,如果想使用类来做,来定义类板装饰定义。
04:15
类啊,作为装饰器好,那在这里边我们就要考虑到装饰器里边有什么东西了啊,考虑到装饰器里边有什么东西,所以我们在定义之前呢,先分析一下装置器有什么东西,首先呢,它可以带有参数,可是不是叫可以带有区分或者使用的参数,当然这个在我们这上面来看的话,其实就是第一个参数arg,对不对,诶,所以这个参数arg。好,这是第一个,第二个它得有什么呢?它得有一个用来接收谁接收原有基本函数的一个参数,或者叫一个函数,对不对。哎,需要第二个需要具有啊,叫接收基本函数传入的参数func,然后呢,还得有什么东西呢,还得有未来的函数inner啊,需要有未来的函数。
05:13
来第三个啊,需要定义未来的函数。OK,这些基本结构我们算是分析清楚了,对不对?那么要想使类来做装饰器,该怎么写呢?首先class,我们叫DEC行不行?好,类写完了,那么如果要使用类作为装置器的话,我们这个,呃,这个这这个名字怪怪的啊,行,就这样写吧。这类叫al,可能大家比较好理解啊,我们定一个类叫al啊,叫al,然后干什么事呢,在使用的时候就这样用O。好的,说这块不写妆。很多学生说这块不写装饰器吗?不啊,我写al,让你会更加好理解啊,因为这个结构的最外层其实就相当于al啊,好了。
06:01
那么在这里边我们可以把这几个东西一样一样的写,行不行?好了,那在这里边它具有一个可以接收参数的位置,首先你要搞明白,你现在这个at al是不是相当于at al相当于at一个类呀,对不对?那么at一个类加上括号的方式,你得到的是什么结果?那你得到的结果是不是像一个at的一个对象,因为大家也知道类加括号的结果不就是一个对象啊,对不对?哎,所以这个要搞明白,但是呢,我们又有一个很奇怪的东西,什么呢?你这个的结果是一个对象布甲,但是作为装饰器而言哈,我们之前的装饰器,所有使用过的装饰器都知道,装饰器它未来一定是一个函数,对不对?装饰器一定是一个函数结构的嘛,是不是你从最开始看也好啊,后边看也好,它的装饰器一定是一个函数结构,这就意味着。意味着什么呢?好来往下拉一下,这就意味着我们刚刚这个结果,你at什么aler,它的结果一定得是一个函数结构,但是我们也知道,你现在艾类括号的结果是一个对象,那么对象不是函数结构啊,但是别忘了。
07:15
对象可以当做函数使用,那么对象当做函数使用怎么办?你是不是得写对象括号的格式?那么你想一想,如何才能让一个对象能够当做函数来调用呢?这个时候大家想一想,我们之前学过的魔术方法里边,把函数,把对象当做函数调用的时候,是不是会触发一个魔式方法叫什么呀,叫扩模式方法,没错,所以在这里边为了实现能够接收我们什么呀,或者叫为了实现这个对象当函数用,这里边一定要具有,一定要具有叫下限,下限空。魔术方法。魔术方法啊,使得对象可以当做函数使用。
08:01
对不对,所以咱就写上这个DF下线下线扣啊,下线下线套上括号,然后写上pass,好,第一步我们分析到这儿了,那么大家想一想,我们正常的装饰器啊,翻到我们的第四步或者第五步都行啊。呃,这个有点过了,我们正常的装饰器你想好了有个什么效果呢?你正常的装饰是一个函数,咱已经解决了,对不对,但是正常函数是不是这个装饰器啊,一定会接收你基本函数的传入。也就是基本函数love一定会传到你的什么呀,这个装饰器里边用参数来接收,那在看到我们这块。我们现在呢,已经模拟出来了什么呀,模拟出来对象当函数使用,也就是对象,现在对象就相当于装置器,对不对,你把对象当函数使用的话,那么这里边儿。一定要能够传入基本函lo,所以这里边需要注意什么呢?需要注意一个FC的传入可能是问这这个这个是吗?是不是很简单,打印下不就可以了吗?它上括号。
09:09
我们把NC给你看一遍啊,反正func,反正我们在这里边已经装饰过了,是不是你看一下能不能有问题啊,但是需要注意这个参数会需要先注释一遍,因为没地方接嘛啊右键运行一遍,你看一下啊,他说语法错误,少了个冒号啊啊右键运行程序大家来看。是不是看到你的函数的传入,Love函数的传入对不对,其他的你先别管,其他你先别管,因为下面咱这个装置器没写完,所以调用会报错,这样的话就没问题了,你看是不是函数确实输出了,确实是love函数,那么这个时候我们解决了装饰器接收基本函数的问题,所以实际上从这边就能看出来,这是装饰器的本体啊。叫做,这是装饰器的本体啊,这是装饰器的本体,就相当于我们的,相当于我们之前的de Co函数。好,这样来,那我们刚刚在里边是不是传过参数啊,是不是写过参数,那么这个参数谁来接收呢?那你想想类加括号,往类的括号里接收的参数谁能收?能收的只有两个人,要么是new魔术方法,要么是什么呀?In it就iit某式法对不对?所以为了他能够接受参数,我们需要在这里边写上初始化某式方法啊。
10:22
初始化魔术方法,那么DEF下线下线init下线下线考上括号。那么在这里边你有几个参数,上面就写几个行仓呗,我举一个我就写一个行不行,那么在这里边啊,在这里边干什么,Pass一下就可以了,那么这个时候你再运行。有AI他也不会报错,看见没有,有参数它也不会报错,所以这样一来的话,我们就把什么呀,把外部的参数传进去了,这就相当于什么呀,装置器的那个,咱说了装置器传输参数那种方式对不对,所以它相当于谁呢?相当于写错了,它相当于我们的al函数啊,Al函数。
11:01
相当于我们之前那个结构复杂的al函数好了,那么啊,接下来哈,那al函数里边如果你接受参数,是不是别人可能会用得到啊,是不是?所以在al函数里边,如果你接收到了参数啊,比AI乘给AG了,你得保证什么呀?未来这里边的所有方法都能用得上,是不是?所以接收的参数需要做一个操作啊,叫做接收的参写错了,不是接收,我叫接收的参数,为了其他啊,其他成员方法可以使用,我们需要干什么事呢?存入对象当中啊,对象。中,那在这里边直接写上sf.arg啊,点arg等于arg,那接下来的话,是不是把你传入的arg直接存到了当前类的对象当中,那么其他方法是不是也可以调用啊,好了,那么arg参数解决了f fun nc参数是不是也解决了,那剩最后一个问题,什么问题呢?定义未来的函数,说白了就是定义我们的什么呀,内部函数inner尔啊,就未来返回那的函数了,这个简单啊,我直接在这里边定义是不是就可以了,来定义内部函数inner,内部函数啊,内部函数inner,那在这边写呗,Df inner它上括号。
12:14
然后呢,Pass冒号,然后在这里边pass一下,别忘了最后还得什么呀,返回内部函数吧。返回内部函数inner这个简单来,Inner这个答案都会写,对不对?好了,那么我们的内部函数其实就是未来的拉,我们需要做什么呀,基本功能的调用。我们需要基本功能的调用,然后呢,需要增加功能,对不对,增加功能好,那么这个时候我们该怎么来完成呢。好。在这里边增加功能一啊,增加功能二。增加功能二,然后呢,基本函数的功调用,我们这很简单,Func括号就可以了,因为是不是已经传进来,咱也测试过了对不对,然后增加功能的话,直接输出print,亲亲啊抱抱啊,然后还有举高高对不对?来print我们写上举高高。
13:09
写上啊,叫举高高好搞定,然后呢,我们来看一下能不能正常调用呢?首先如果直接运行语法没有问题啊,然后呢,我们在里边通过love的方式来调看是否能够成功运行一遍,来抱抱轻轻语缸是不是成功了,基本的调用增加的功能是不是都出来了,这样一来的话,我们的什么呀,就可以把一个类作为装置器来使用了,但是它还不够严谨,为什么呢?我们一般情况下是不推荐在类的方法中写内部函数的,而是尽可能将功能细分,也就是说这个因而最好不要写在这里,而把它单独做一个成员方法存在,那么这个难吗?并不难,那么我们把这个函数直接提取到最外层,做成一个方法。这是将啊inner作为我们类的类的方法存在,当然做分法的时候是不是给加个算法对不对?好了,那么这里边会产生另外一个问题啊,什么问题呢?这个f func找不着了,因为func它明显传入的是扩方法中,而不是in的方法中,所以你钓不着,那怎么办呢?没关系,在触发扩的时候我们也可以干什么事呢?
14:21
我们也可以把它。括所接收的参数一起存到对象当中,是不是?所以在里边啊,将括接收到参数func存入对象,只要存到对象里边,是不是任何方法都可以用了,所以在这里边我们直接写上s.c func等于f func,那么参参数一传入,我就立马把它存到当前对象里边用了是不是?那么在下面in呢里边想使用这个方法是不是只需要通过我对象本身来调用就可以了,那这样的话方法就可以调用了。好,返回的时候你返回inner inner不再是内部函数,而是一个乘象方法的时候,我是不是应该返回sf.inner呀,是不是?这样一来的话我们就完成了,我们什么呀类作为装饰器,效果和刚刚一样啊,而且结构看起来非常清晰,来运行一遍程序。
15:12
是不是完成了。这就是我们的第九步啊,把类作为装饰器使用,这算是一种比较高阶的应用方式啊,大家在使用的时候呢,需要对类和装饰器有一个非常深入的了解,才能转换成这种格式,当然这边也需要注意一下,这个参数我没用啊,如果你需要用,需要判断呀,或者需要什么呀,比较啊,那么在这里边是不是通过self.a都可以取得到啊,是不是?好了,把这个主持教我们下面进入第十步的操作。第十步,我们要把装饰器啊来给另外一个东西使用。第十步。第十步,我们之前的装饰器啊,一直给谁用啊,是不是一直给函数用啊,对不对,但是实际上类也可以使用装置器的,所以看好了,我们现在叫做为类啊添加装饰器能看懂吗?就给类加上装饰器,很多时候装饰器还可以装饰类吗?可以的。
16:08
你想一想,装饰器无非就是什么呀,给函数加功的,那别的也可以加啊。那么这个时候我们需要先定义基本类啊,定义一个基本类类名随便class,比如说我们叫它Hun人类行不行,然后呢,Pass一下人类里面有没有成员,其实问题不大。我们正常情况下在这里边干什么事呢?叫做使用类,那么使用类其实就是实例化对象呗,那么大家看实例化对象的过程huma啊,是不是跟调用函数又长的一样啊,是不是,所以就是因为这个结构跟函数调用一样,我们也可以装饰什么我们的类啊,好了,那我现在先干什么事呢?写一个啊,写一个,写一个参数,接收一下我们的对象,打印给大家看看friend超声括号负责人,好,现在我们确实实例化出来对象了。
17:00
是不是注意一下,那这个对象有什么成员吗?有什么自身的成员吗?来点下线下线D来我们来观察一下。你会发现他没有成员的,因为我们也什么也没加,对不对啊,就算继承object的他也没有在我们的对象当中看见了吗?也就说你做出了一个人,这个人什么成员都没有,那为此我就可以给他加工的图表,我要什么呢?我要保证这个人一出生就一定会给他一个成员,行不行?这个对象一个成员不就是给他给这个人的对象加功能吗?是不是好?怎么加呢?首先在这里边定义装饰器。好,我们定义装饰器,看看怎么写啊,定义装饰器啊,装饰器用函数版本也行,类版本也行,不过推荐大家用函数版本吧,好吧,我们D来de CU。写个简单就可以了,然后呢,干什么事呢,Pass一下,然后装饰的时候怎么办呢?直接在这里边at一下就可以了,艾,我们装饰器de好不好,也就是说你这个类会传入到我们de CU的这里边接收,那么这里边既然自然写参数了,我们写了一个CS,很都说会吗?来给大家打印一下看看。
18:08
来,你会发现这个类真传进去了。啊,你看类是不是打印出来了,下面这个别着急啊,是返回值的问题啊,其实就是最后一步调用的问题啊,这个我说了先不用着急看后边啊,但是我们确实可以确定这个类还真传进去了,看到没有,是不是真正的把这类打印出来了,所以可以确定装饰器是生效了的,但是没完,你别忘了,我们装饰器原来是要产生未来的函数,对不对?那么现在你要产生什么呢?你就要考虑现在human加括号。它是什么作用,它的结果是什么?那么大家知道啊,Human门加括号的方式,它结果就相当于调用,咱就可以这样理解啊,相当于调用Hu m函数,然后呢,得到了一个什么呀,一个结果,而且这个结果我们还可以确定它是一个对象,是不是,因为讯问本身是一个类嘛,类调研的结果不就是一个对象吗?好,那这样一来的话,我们就可以在干什么事呢?
19:05
定义内部。啊,内部信息其实就是干什么事呢,注意到了,其实这就相当于原来的inner啊,相当于原来的inner,但是啊,咱不能写成什么inner函数,为什么呢?因为它毕竟它咱可以写成,那咱可以写成,那我看可以写成inner函数啊,那咱就写吧,DF也可以写成inner,没问题啊,刚刚想错了啊,好了,然后在这里边我们写上inner。好,然后呢,在里边pass一下,别忘了返回in那哦返回啊返回呢。记错了啊,叫返回in的函数啊。好了。好,那这样一来的话,我们就知道一个事情,什么事情呢?这个inner,它就是未来human。对不对?那就保证human的结果和因儿结果得一样,我们已经知道了human调用的结果是一个对象,对不对?那么因ner的调用结果一定也得是一个对象,所以在这里边干什么事呢?产生对象并且返回啊,产生我们hum类的对象。
20:11
类的对象啊,叫并且返回啊,那产生产生一个对象没这么难嘛,直接ACS,因为类已经传进来嘛,套上括号,这样的话我们就可以得到一个对象了啊好OBJ接收一下得到对象了,然后别忘了返回这个对象啊,返回对象。返回对象,那么来return OB BJ很多说这一样吗?大家想想啊,虽然结构不一样,但是结果是一样的,你看因ner的结果是返回了一个对象对不对?咱一看确定了吗?这这把类传进来吗?实例化类不得到一个对象吗?那么你再看你的human,你的human调用的结果是不是也是一个对象啊?所以现在与就是理结果是相通的,那么能不能用呢?答案是完全可以用。
21:00
来请大家看一下。看一下是不是验出来了一个空的,是不是对象成功了很多,说这个对象是真的吗?来,对象我也给你打印一下,免得你说我糊弄你,对象我也给你打一下好不好,你看一下是不是我们的对象。是不是也出来了,是不是好,当然出来了之后有一个小小的问题,什么问题呢?这啥也没干呢,是不是没错,我们现在是做了一个整价操作,我们以前做装饰器的时候,是不是都可以给装饰器什么增加功能啊,你这个位置啊,你这个位置它是相当于我们的基本功能,相当于基本功能,那我们是不是想给它加东西,装饰器必须要加东西嘛,是不是,那我们在里边来添加内容呗,添加内容那就相当于增加功能了,相当于啊增加功能,那么你给对象,你产生的不是对象吗?你给对象加什么,我就加成员呗,所以OBJ看好了DRH等于我加了一个姓名啊,不是加了一个年龄,OBj.six啊OBJ啊点six ex啊点。
22:02
点six啊,我等一个ma,那么大家看一下我现在增加的功能,右键运行一下程序,你就会发现真的实现了,为什么呢?每个对象出生的时候都会自带这两个成员,你看装饰器是不是也成功了,是不是?这就是我们的第十步给类添加装饰器,其实我们这块用的是一个等价原则啊,就是类的调用结果是一个对象,那么我把这个因呢的返回值设置为一个对象是不是就可以了啊?好,这是我们的第十步啊,好,第十步完了之后,进入我们的最后一步,我们第11步,当然第11步就比较简单了。好了,我们来看一下我们的最后一步,第11步。第11步。第啊11步。我们的第11步做什么操作呢?叫做多层装饰器嵌头。嵌套啊嵌套,那么装饰器不是说一个函数只能用一个,是可以用多个的啊,想用几个其实都可以啊,所以它是可以嵌套的。那么为了让装饰可以嵌套,我们先来给大家做个例子啊,先定义基本函数来D,我们写上lo,考上括号,然后呢,Pass一下,别pass friend,好吧,我们还写上亲亲啊。
23:18
我们还写上氢漆,OK,然后呢,为了让我们的装饰器可以装饰它,是不是得有装饰器啊,是不是,所以在里边定义装饰器,定义装饰器一我们先写一个怎么样来DF装饰器DDC跑上括号,然后呢在这里边pass一下,我们知道装饰器装饰的时候需要在这里边啊,没写一哈,需要在这里边艾特一下装饰器对不对,好,我at de CU,好,然后呢,以。然后我们需要把love传到这里边儿,所以需要行三接受f func里边定义内部函数,看好了定义内部函数来,我们的DeFin呢,考上括号。
24:00
然后呢,冒号。然后呢,别忘了返回啊,我们的内部函数,因为它是未来的love,是不是来返回内部函数。返回内部函数在里边。直接return我们的好搞定,来接着来做啊,当然我没有加Y层的不符杂啊,来,我们接着来做,现在呢,在in里边是不是得需要调用基本功能。调用基本功能好。基本功能,然后呢,还要扩展功能,或者叫增加功能,是不是增加功能啊,一增加功能二。增加功能二,OK,然后基本功能调用直接通过fun函数就可以了,然后呢,增加功能我们可以在里边直接进行输出print,我们写上啊,叫做抱抱。然后呢,增加功能二,我们还写上举高高。好,请上举高高,好,然后呢,装饰成功了吗?来这个是没有问题的,因为答案已经写好多了,对不对,所以我们在里边调用函数了。
25:05
拉好长括号,右键运行程序。看是不是成功了,然后接下来我们还可以再写一个装饰器,看好了叫做装饰器二。啊定义主要是七二。定义写错了,叫定义装饰器二,在这里边D,我们再定一个装饰器DEC2,然后套上框。Pass一下怎么用呢?很简单呀,这里再at一下就可以了,At dc2,这就表示什么呀?双层嵌套啊双层嵌套,然后呢,做很多时候可以这样做嘛,语法上支持吗?很简单啊,其实是知持,因为大家也知道love本身是个函数,经过装饰器一装饰之后,结果是不是还是一个函数啊,那这个函数自然可以再被装饰器装饰了,完全没有问题的好,那么装饰七二和装饰七结构上是没什么区别的啊来在这里边啊,我们写一下定义内部函数。
26:00
内部函数来也叫一呢,DF呢。这个时候大家就会有一些疑问了,说哎呀,你这个音呢和这个音呢,会不会冲突了,或者叫重复了,是不是?答案是不会,因为我们之前讲过,内部函数它是局部变量,根本就不会影响,对不对?好了,那么接下来啊,别忘了我们返回内部函数。来返回内部函数。在里边re return一下inner就可以了,好,然后呢,这个inner里边也要什么呀,要增加功能,基本功能是不是,哎,要基本功能的调用,然后要有增加功能啊,增加功能还是那句话呀,你增加功能可以前面可以后面,无所谓哪个位置啊,只不过加写示的显示比较对称对不对,增加啊功能二,那上次增加的是抱抱和举高高啊,我们这一次增加功能叫做print套上。叫做转转啊,转转转圈啊,然后基本功能调用还是老规矩,Func好上括号,然后呢。
27:01
增加功能二啊,我们在这里边啊,Print套上框啊,叫做呃叫做什么呢?笑笑一笑行不行,笑一笑好搞定,那么我们的装饰七二也就完成。那么最终装饰结果会是什么样子呢?右键运行程序。我们会发现。亲亲,是最终最开始的基本函数,但是被我们装饰了之后,外边是不是加了两层是不是?哎,这也这里边上一个问题啊,就是装饰器多层嵌套的时候,它是怎么装饰的?注意是从基本函数一层一层往上装饰的,也就是说love先被装饰器一装饰,装饰的结果再被装置器二装饰,明白了吗?所以大家看到这个结果也是啊,轻轻基本函数装饰器装饰完了,是不是第一个装饰器装饰完了,再加上外边是不是第二个装饰器装饰完了,这就是关于装饰器11步的所有语法,你把这11步学完,外化装饰器对你来说就没什么难度了。当然装饰器是我们语法当中比较困难的一个东西,所以大家一定要在基础扎实的情况下来了解哈,否则的话,我建议你先知道这个东西啊,深入了,等你前面知识扎实了之后再来继续看这个东西啊,好了,那么感谢大家的收看,本小节到此结束,下一小节我为大家带来的是。
28:19
面向对象常用的函数。
我来说两句