欢迎光临散文网 会员登陆 & 注册

0719-闭包,装饰器

2023-07-19 22:34 作者:GHWNM  | 我要投稿

闭包,装饰器

现在有一条线 给你x的值,求y,公式是y = k*x+b,k和b为每一条线

这个问题有很多种方法解,定义函数啊,类啊等等

__call__方法,编码调用 对象() 时自动执行call方法,虽然用类能解决

但是每个线都要一个专门的对象,占用空间

于是本次的主题-->闭包,就是函数里定义一个函数,一个函数套另外一个函数,而且你要用的是内部那个函数

(而且一般内部函数是要用到外部函数的变量,以及这个比专门创对象的空间占用少很多,但是只能做一些小的功能)

def func01(k,b):

def func01_1(x):

print(k*x+b)

return func01_1


line_6_1 = func01(1,2) 1

line_6_1(0) 2

line_6_1(1) 3

line_6_1(2) 4

就像这样,跟类很像对吧

具体怎么执行的呢?

因为程序看到def定义函数的时候会跳过,所以我在第一行调用的时候会进func01里,然后看到def func01_1会跳过

然后看到return func01_1,实际上这个时候func01_1代表的是指向func01_1的一个变量名

然后line_6_1把这个存储起来,也就是指向了fun01_1这个函数,然后在下面调用line_6_1的时候相当于调用func01_1

很巧妙的方法,最开始看会有点蒙,这个东西巧在哪,他就是只用了函数的基础特性,举个笑话,给你说了函数,然后让你自己摸索出来闭包(

好了,你已经学会基础语法和函数了,快去写个装饰器把

咳咳,然后我们就要开始学装饰器了,闭包就是函数的高级用法和装饰器的前置


装饰器

这个东西是程序开发中比较基础的内容,对于自学者来说比较绕,一般自学就绕过去了,但是面试,开发中都会用的

比较重要,一定要认真学

举个例子,一个公司有好多个部门,其中有这样几个部门:

基础平台/接口开发部 调用部A 调用部B

现在你老板让你加个权限认证,让调用的时候只有一部分人能用,你怎么弄

装饰器就是不给A,B说让他们自己做,也不用修改基础的平台/接口(已经写好的函数,功能)

自己再另外写个闭包函数,之前咱们写的闭包内函数是直接返回个公式对吧,现在把他返回外函数接收的东西,但是返回之前加上你要做的功能

然后外部在储存的时候不用一个新的变量,用本来的函数名,也就是说这个函数名现在指向的是你的装饰器内部的功能,先执行你的功能,在执行原本的功能

这样就实现了在不修改原本代码的情况下,扩展新功能(加个权限认证啊之类的),遵循了开闭原则

但是这个东西不能在函数里面做东西,要么在整体之前,要么在整体之后扩展功能

这个东西相当于,把原来函数名的指向改成了内函数,里面的参数是原本函数名指向的函数,而原来的函数也没有被销毁,是在内函数里挂着他的

所以这个装饰器跟面向对象的类很像,都是一种模板,所以每次在写@的时候就开始装包闭包了,也就是外函数和内函数中间的语句会开始执行了

不定长参数也简单,内函数里加个*args,传进去的时候也*args拆包,关键字不定长就一样的,只不过俩都多加个*

要返回参数的话就直接return就行了,没返回值的你调return自然就没有,(如果功能函数返回的是200,OK是啥啊,元组嘛)

好了,这些就是一个装饰器的使用过程了,没错,还有多个装饰器对同一个函数进行装饰(


多个装饰器装饰同一个函数

这个实际上不难,就是逻辑上要弄通

@装饰器1

@装饰器2

def 函数():

pass

这个代码在执行的时候,是先启用装饰器2,再启用装饰器1,但是执行装饰代码的时候还是正着来,先1后2

因为他在@装饰的时候发现下一行代码不是目标,就先等他执行完变成可装饰对象才会再开始装饰

所以就会先让装饰器2开始装饰,但是执行的时候就相当于几个def函数嵌套,还是根据装饰的先后来的

反正如果要记的话就是装饰过程倒着来,执行的时候还是正着的


0719-闭包,装饰器的评论 (共 条)

分享到微博请遵守国家法律