装饰器功能,就是在运行原来原代码功能基础上,加上些其它功能,比如:
1、引入日志
2、函数执行时间统计
3、执行函数前预备处理
4、执行函数后清理功能
5、权限校验等场景
6、异常的处理
7、缓存等等。
不修改原来的代码,进行功能的扩展。
先明白下面的代码:
Paste_Image.png写代码要遵循开放封闭原则
封闭:已实现的功能代码块
开放:对扩展开发
虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展。
def w1(func):
def inner():
print('验证1')
func()
return inner
@w1
def f1():
print('f1')
python解释器就会从上到下解释代码,步骤如下:
def w1(func): ==>将w1函数加载到内存.
@w1
没错, 从表面上看解释器仅仅会解释这两句代码,因为函数在没有被调用之前其内部代码不会被执行。
从表面上看解释器着实会执行这两句,但是 @w1 这一句代码里却有大文章, @函数名是python的一种语法糖。
上例@w1内部会执行一下操作:
执行w1函数
执行w1函数 ,并将 @w1 下面的函数作为w1函数的参数,即:@w1 等价于 w1(f1) 所以,内部就会去执行:
def inner():
#验证 1
#验证 2
#验证 3
f1() # func是参数,此时 func 等于 f1
return inner# 返回的 inner,inner代表的是函数,非执行函数 ,其实就是将原来的 f1 函数塞进另外一个函数中
w1的返回值
将执行完的w1函数返回值 赋值 给@w1下面的函数的函数名f1 即将w1的返回值再重新赋值给 f1,即:
新f1 = def inner():
#验证 1
#验证 2
#验证 3
原来f1()
return inner
接下来是多个装饰器的运用
多个装饰器,按照从内往外(从下往上)先后顺序执行
为了方便记忆:可以理解为先写后运行,先写后结束
def makeBold(fn):
print('makeBold...')
def wrapped():
return "--1--" + fn() + "--1--"
return wrapped
def makeItalic(fn):
print('makeItalic...')
def wrapped():
return "--2--" + fn() + "--2--"
return wrapped
@makeBold
def test1():
return "hello world-1"
@makeItalic
def test2():
return "hello world-2"
@makeBold
@makeItalic
def test3():
return "hello world-3"
print(test1())
print(test2())
print(test3())
运行结果如下:
makeBold...
makeItalic...
makeItalic...
makeBold...
--1--hello world-1--1--
--2--hello world-2--2--
--1----2--hello world-3--2----1--
网友评论