不带装饰器的
运行下方的代码
def funa(a):
print('1')
a()
return '233'
def funb():
print('2')
return ''
funb=funa(funb)
print(funb)
输出的结果是
C:\Users\Administrator\PycharmProjects\flaskProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/flaskProject/test2.py
1
2
233
Process finished with exit code 0
这是一个不带装饰器的代码
首先定义了一个funa的功能函数,再次定义一个funb的功能函数
之后我们使用了funb=funa(funb)对funb进行了重新复制
从顺序上,funa首先被定义,此时funa是一个功能函数,当代码中写入funa()将会运行这个函数
其次funb被定义,此时funa是一个功能函数,当代码中写入funa()将会运行这个函数
最后我们使用了funa(funb)对funb进行了赋值
这里,funb首先是一个功能函数,作为funa的参数导入,按照funa函数内定义的顺序,首先打印了1,接着运行了funb()函数,最后将233作为返回值
所以最后对funb进行赋值时候使用233,赋值完成后,funb从原来一个功能函数变为了新赋值的字符233
所以最后对打印funb的输出结果是233
带装饰器的
运行下方代码
def funa(a):
print('1')
a()
return '233'
@funa
def funb():
print('2')
return ''
print(funb)
得到以下结果
C:\Users\Administrator\PycharmProjects\flaskProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/flaskProject/test.py
1
2
233
Process finished with exit code 0
可见装饰器@的作用其实相当于不带装饰器的代码中的funb=funa(funb)
使用装饰器后,funb作为参数传给funa()
funa(funb)的返回值又再次赋值给了funb
所以运行了装饰器代码后再次打印funb,输出结果为233
带参数的装饰器
运行下面的代码
def funa(a):
print(a)
def funb(b):
print(b)
return 'bbb'
return funb
@funa('/index')
def func():
print('c')
return 'ccc'
print(func)
得到结果
C:\Users\Administrator\PycharmProjects\flaskProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/flaskProject/test2.py
/index
<function func at 0x000002A9A2748798>
bbb
Process finished with exit code 0
可见对于带参数的装饰器,被装饰的函数func的函数指针是传递给funa函数内部定义的函数funb,作为funb的参数的
并且funa的返回值要求是funb
否则将报错
其实相当于不带装饰器的下段代码
def funa(a):
print(a)
def funb(b):
print(b)
return 'bbb'
return funb
def func():
print('c')
return 'ccc'
func=funa('/index')(func)
print(func)
得到结果
C:\Users\Administrator\PycharmProjects\flaskProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/flaskProject/test.py
/index
<function func at 0x000001FE0ADE81F8>
bbb
Process finished with exit code 0