Python修饰器
学前班——函数闭包
Python作为开发效率极高的编程/脚本语言,函数可以作为一个参数传入另一个函数,或是在一个函数实现中嵌套一个或者多个函数。带来的一个特性就是函数闭包,所谓函数闭包就是一个函数return了一个内部嵌套函数
def func(a, b):
c = 10
//内部嵌套函数inner_func
def inner_func():
s = a + b + c
return s
return inner_func
在上方代码中,函数func返回了一个不同于自己的函数名称,而与这个函数名称(或是说返回值)相同的函数inner_func是函数func的内部嵌入函数。
假设函数func被执行,它的执行过程是这样的:
-
执行func(a,b) -
传入变量a,b -
建立局部变量c=10 -
返回值inner_func
- 注意,不要加(),不加括号表示返回func的函数地址
- 实际使用的时候需要加(),后面会补充
-
函数返回值与func内部嵌套函数一致,执行函数inner_func -
继承被嵌套函数(本例为func)的传入值与已执行过程结果
- 传入值:a,b
- 已执行结果:c=10
-
执行s = a + b + c -
s作为返回值被返回
以上就是具有函数闭包特性的函数实例内容,理解了这部分内容,我们可以在此基础上不断套娃:
在main中调用时,需要注意调用方式:
由此我们可以知道,函数闭包的特性可以为某个函数通过嵌套函数的方式增加新的功能,这样不需要修改函数本身的代码就可以新添加功能。
我们可以重复这个过程不断地添加新功能。我们可以抽象为下面这个套娃模型:
显然,当添加功能次数过多,似乎这种特性也会变得复杂。大量的缩进,从阅读上来说,也很难再让人觉得新功能与功能是相对分离的。
于是,Python在此函数闭包的特性上进行了改进,提供了修饰器。
强大的修饰器——函数闭包的另一种形式
Python提供了强大的修饰器,其本身虽然在实现上和函数无异,但是用好修饰器可以更简单地为已有函数添加新的功能。并且无论是从代码阅读上还是编程过程上,都很好地实现了原有功能与新加入功能的分离。
可以看到,通过修饰器完美地将新功能分离了出去,不然还得套娃。另外就是调用执行变得简单了,直接执行装饰器中的函数就行了。
由于装饰器本质还是函数,还有很多种使用方式,具体可以见CSDN文章里的讲解。进对于app.route()的使用,目前的装饰器知识点够了。
@app.route()
Flask作为一种轻量WEB框架,程序实例在运行时需要知道你访问了哪个URL,这样才好知道要运行哪些代码,比如Flask库中默认的函数会根据传入URL调用Jinja模板渲染不同网页。在Flask中这种URL和函数的映射关系称为路由(route),app即为程序实例。
当然,只使用Flask默认的映射关系显然是不够的,因此我们需要按照当下需求添加新的功能。于是,Flask为实例提供了路由修饰器,即@app.route()。
上面代码是一个简单的例子,其作用是当
def func(a, b):
c = 10
//内部嵌套函数inner_func
def inner_func():
s = a + b + c
def inner_inner_func():
sum = s + a + b + c
return sum
return inner_inner_func
return inner_func
x = func(1, 3)//此时x的值是inner_func的地址以及传入参数的地址
print(x())//执行的时候需要带括号
def A()://根据需要可以传参
[基本功能A]
def B():
[添加功能B]
def C():
[添加功能C]
......
def N():
[添加功能N]
return [具体结果]//也可以不返回,根据需要
return N
......
return D
return C
return B
def funcA(newFunc)://函数名表示函数地址,通过地址传值实现函数传值
print("执行1")
def inner_func:
print("执行2")
def inner_inner_func
print("执行3")
newFunc()
return OK
return inner_inner_func
return inner_func
@funcA
def comment()//这里的本质:newFunc=comment, funcA(comment)
print("执行4")
//执行
comment()
from flask import Flask
app = Flask(__name__)//实例化
@app.route('/')
def newFunc1()
print('打印字体')
|