一,有参装饰器的知识储备
1,@变量名-------以print为装饰器为例
@print ‘’‘或者@其他装饰器名字’‘’
#会将index当成参数传给print(),并将返回值赋值给index。index=print(index),print返回值为None
@print # index=print(index),会将正下方的index当成参数传给print(),并将返回值赋值给index
def index(x, y):
print(x, y)
print(index)
所以执行之后结果为:
<function index at 0x0000019F70C77AF0>
None
2,@print()
‘’‘变量名+()是触发功能运行,先执行print(‘hello’),在将返回值放到@后面,print返回值是None,所以变成@None。此时变成@None---->index=None(index)’‘’
@print('hello') #变量名+()是触发功能运行,先执行print('hello'),在将返回值放到@后面。此时变成@None---->index=None(index)
def index(x, y):
print(x, y)
print(index)
执行之后变成:hello已被打印(变量名+()触发功能运行),None类型不可调用的错误(index=None(index))
hello
Traceback (most recent call last):
File "C:/Users/ricardo/PycharmProjects/pythonProject1/pythonProject/function/有参装饰器.py", line 10, in <module>
def index(x, y):
TypeError: 'NoneType' object is not callable
二,有参装饰器的需求由来
1,普通装饰器
def outter(func):
def wrapper(*args, **kwargs):
print('WHAT DO YOU WANT OUTPUT!!!???')
res = func(*args, **kwargs)
print(id(wrapper))#为了显示一下wrapper的id
return res
return wrapper
@outter # index=outter(index),此时是将outter的返回值wrapper赋值给index
def index(x, y):
print(x, y)
print(id(index))#为了显示一下index的id
index(1, 2)
执行之后:
2251617631536
WHAT DO YOU WANT OUTPUT!!!???
1 2
2251617631536
2,增加需求之后
def outter(func):
def wrapper(*args, **kwargs):
with open('test.txt',mode='rt',encoding='utf-8') as f: # 此处的文件路径被写死了
for line in f:
print(line)
print('WHAT DO YOU WANT OUTPUT!!!???')
res = func(*args, **kwargs)
return res
return wrapper
@outter #
def index(x, y):
print(x, y)
index(1, 2)
执行之后
python
ricardo
WHAT DO YOU WANT OUTPUT!!!???
1 2
3,在上述增加需求之后我们可以看到文件路径被写死了,但是我们需要一个未被写死的路径
def path(file_path):
def outter(func):
def wrapper(*args, **kwargs):
with open(file_path,mode='rt',encoding='utf-8') as f: # 此处的文件路径被写死了
for line in f:
print(line)
print('WHAT DO YOU WANT OUTPUT!!!???')
res = func(*args, **kwargs)
return res
return wrapper
return outter # 执行@path('test.txt')得到该返回值
@path('test.txt') # 执行path('test.txt')之后得到返回值outter;变成@outter,然后将outter(index)的返回值'warpper'的地址复制给index
# index=outter(index)
def index(x, y):
print(x, y)
执行之后
python
ricardo
WHAT DO YOU WANT OUTPUT!!!???
1 2
总结:
①由@path(‘文件路径’)执行path(‘文件路径’)并且得到返回值outter;
②然后变成执行@outter---->index=outter(index) ‘‘注意此处是执行outter(index)后返回值即‘wrapper’的地址复制给index’’