python闭包特性&&python函数装饰器

学习中闭包的特性利用笔记&&python函数装饰器
本质是python的’一切皆对象’(雾)

闭包的特性利用

闭包的1个重要特性是: python里嵌套函数阔以记得使用过的外部函数
甚么意思捏?
eg:

1
2
3
4
5
6
def foo():
def bar():
print("dick")
return bar #这里是return bar而8是return bar()
a=foo()
a()

结果:

dick

上述代码函数内写了个函数bar(), 并把bar()函数作为1个变量返回(因为py中,函数和变量等价,等价,等价)

而在此介绍py闭包的一个特性:嵌套函数会记住使用过的外部变量

eg:

1
2
3
4
5
6
7
def foo(e):
def bar(e):
print(e)
return bar

a=foo("shit")
a()

结果:

shit

上述代码和python的特性8符合,当return bar之后,e作为局部变量会被销毁,但是结果却成功输出了,这就因为python的另一个特性: 嵌套函数会记住使用过的外部变量(局部变量销毁后仍会被嵌套函数记住)

所以这个特性有毛用呢?

用来生成8同函数

eg:

1
2
3
4
5
6
7
def foo(e1):
def bar(e2):
return e1+e2
return bar

a=foo(100)
a(200)

result:

300
上述例子就可以利用该特性批量生成8同函数

还有什么用呢?好像没了

可以取代生成全局变量

eg:

1
2
3
4
def x(a,b):
def y(a,b):
print(a,b)
return y

函数装饰器

装饰器本质是函数或者类,他的作用是: 为原来的函数增加新的功能。装饰,顾名思义,就是在事物8变的基础上实现一些扩展

应用场景: 某天,你用python写了1堆函数,然后你突然想为这些函数加1个相同的功能,比如print(“d1ck”),那么1个1个改就很麻烦,那么装饰器就派上了用场~

eg:

1
2
3
4
5
6
7
8
9
10
11
def func1():
print("abc")

def ch4nge_func(func1):
def func2(func1):
print("d3f")
return func1
return func2

f00=ch4nge_func(func1)
f00()

结果:
>>>abc
>>>d3f

这个函数我没看懂….感觉有点毛病(它func2返回的8还是原来的func1吗?),但是8太要紧,反正只要知道装饰器大致都是这么写的就好了,然后这样做也实现了修改函数的功能

然后研究了1下,把这认为是装饰器的1种新姿势吧….上面代码定义ch4nge_func里把return func1换成func1(),结果也还是一样的

然后写完了ch4nge_func后,再进行调用就阔以实现修改函数的目的啦,有2种调用方式,1种是func2=ch4nge_func(func1)就改成了新函数(若8想新生成函数也可func1=ch4nge_func(func1));还有1种那就是用python的语法糖,比如上述代码用语法糖简化就是:

1
2
3
4
5
6
7
8
9
def ch4nge_func(func1):
def func2(func1):
print("d3f")
return func1
return func2
@ch4nge_func
def func1():
print("abc")
#这里的@ch4nge_func等价于----func1=ch4nge_func(func1)

再深入学习一下,了解一下装饰器的另1特性

装饰器修改函数后改变了原函数名字: functools.wraps

1
2
3
4
5
6
7
8
9
10
11
def abc():
print("4bc")

def ch4nge_func(func1):
def func2():
print("d3f")
func1()
return func2

abc=ch4nge_func(abc)
print(abc.__name__)

运行结果:
>>>func2

然而你想的打印结果应该是 abc 对8对? 这是因为func2重写了func1和其注释文档,多数情况下无伤大雅,如果你想保持原状,只要用到functools库里的wraps函数就阔以了

在定义装饰器函数时第一行顺便写入@wraps(‘你传入的func’)就阔以了,eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
import fuctools
def ch4nge(func1):
@wraps(fucn1)
def func2():
print("FuuuuuuuuuuuCk")
return func1
return func2()

def abc():
print("4bc")
abc=ch4nge(abc)
print(abc.__name__)

结果: >>>abc

应用

在web中检查某用户是否有权限访问web某页面: 没看懂,就8贴源码了
总之原理先搞懂,应用以后应该会用得上的(咕)


python闭包特性&&python函数装饰器
https://bl4zygao.github.io/2022/03/07/闭包特性的一些用途-抄/
Author
bl4zy
Posted on
March 7, 2022
Licensed under