Python修饰器和Flask的app.route修饰器

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被执行,它的执行过程是这样的:

  1. 执行func(a,b)

  2. 传入变量a,b

  3. 建立局部变量c=10

  4. 返回值inner_func

- 注意,不要加(),不加括号表示返回func的函数地址

- 实际使用的时候需要加(),后面会补充
  1. 函数返回值与func内部嵌套函数一致,执行函数inner_func

  2. 继承被嵌套函数(本例为func)的传入值与已执行过程结果

- 传入值:a,b

- 已执行结果:c=10
  1. 执行s = a + b + c

  2. 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('打印字体')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值