- 函数外可以访问函数内的变量
写个简单的装饰器
def get_result(func):
def warp(*args, **kwargs):
print('haha warp')
result = func(*args, **kwargs)
print('result:', result)
return result
return warp
def add(a, b):
print('func add:', a + b)
return a + b
if __name__ == '__main__':
add(1, 2)
执行结果:
haha warp |
解释:
- add会作为参数func传给get_result函数,然后get_result返回warp函数。
- 执行add.__name__会输出wrap
- 其实这是python解释器在背后吧warp赋值给了add,然后add就保存了warp的索引,每次调用add(a, b)都是在执行warp(a, b)
解决name属性被修改的问题
释执行结果:from functools import wraps
def get_result(func):
def warp(*args, **kwargs):
print('haha warp')
result = func(*args, **kwargs)
print('result:', result)
return result
return warp
def add(a, b):
print('func add:', a + b)
return a + b
if __name__ == '__main__':
a = add
a(1, 2)
print('name:', a.__name__)
if __name__ == '__main__':
a = add
a(1, 2)
print(a.__name__)haha warp
func add: 3
result: 3
name: add
解释:
- functools.warps是为了在装饰器中方便的拷贝被装饰函数的签名
怎么生成传参装饰器
from functools import wraps |
执行结果及解释
结果:
# -------------login------------ |
解释:
这个用户鉴权装饰器应对于登陆和登陆后的鉴权,如参数has_token,当为False时,说明
是登陆,反之说明已经登陆成功,应携带token参数请求接口,其他的逻辑应该很简单.