一、前言
二、Python中函数特性
装饰器是在不改变对象结构的情况下向现有对象添加功能,它比生成子类更灵活,要理解装饰器之前我们先要要掌握Python中函数重要的几个特性。
【Python中一个函数既可以做为参数被传递,也可以做为另一个函数的返回值】
1、函数中传递函数
执行结果如下:
注:func2定义了一个入参为函数类型,并且在函数内部执行该传入的函数,这里调用时把func1这个函数传进去,这个和Java中的入参为接口,然后调用接口的方法差不多(Android中大量的callBack就是这样实现的)。
2、函数中定义函数
定义一个函数后可以在其内部再定义一个函数(嵌套函数)。
注:func1内部定义了函数func2,func1执行时可以调用内部func2,直接执行func2提示未被定义,说明func2只能在func1中被调用
3、函数返回函数
一个函数可以将另一个函数做为返回值返回。
执行结果
注:执行func1(1)返回的func3是指向func2函数的地址,然后执行func3(2)就会调用func2函数输出其返回值。
4、函数内省
函数内省是指在运行时检查对象类型的一种能力,可以理解为类型检查。
内省常见的方法如下:
三、装饰器
Python中的装饰器是高级语法(Java中装饰器是一种设计模式),它的作用是为已经存在的对象添加额外的功能,常用于插入日志、Web权限校验和缓存等,在使用上和Java的AOP、Annotation比较相似。
1、最简单装饰器例子
执行后输出
注:一个最简单的装饰器,入参为函数,函数内部嵌套函数并且返回内部函数地址,这个其实可以理解为Java中的AOP。
2、使用@调用装饰器
更简单的语法糖 @+装饰器名称放在要被装饰函数前面。
执行后输出
3、带参数的装饰器
执行后结果输出
Flask常见的装饰器@app.before_request、@app.after_request、@app.error_handlers()、@login_require()以及@app.router()等等,理解了装饰器以后我们就可以往下继续阅读@app.route("/")的源码了。