闭包和装饰器
(一) 闭包
1 闭包条件
- 函数必须是嵌套关系
- 外层必须要返回内层函数
- 内层函数必须用到外层函数的变量或参数
2 示例
def func(): # func 是外部函数
msg = "hello,world!"
def inner(): # inner 是嵌套函数
print(msg)
return inner # 返回了内部函数
def func2():
msg = "你好世界"
def inner(): # inner 是嵌套函数
print(msg)
return inner # 返回了内部函数
f = func()
f = func2()
3 作用
- 避免全局污染(主要)
(二)装饰器(特殊的闭包)
作用:在不改变源代码的前提下,给源代码增加功能。
#装饰器格式
def func(fn):
def inner():
# 函数执行前需要做的事
fn()
# 函数执行后需要做的事
return inner
# 被装饰函数
@func
def f():
print("f函数")
万能装饰器
# 万能装饰器
def func(fn):
def inner(*args,**kwargs):
# 函数执行前需要做的事
print("f函数执行前进行验证")
res = fn(*args,**kwargs)
# 函数执行后需要做的事
print("f函数执行后,做的事情")
return res
return inner
装饰器应用
身份认证、权限授权、资源访问、日志记录、时间统计等等。
装饰器总结:
1 装饰器函数中的inner参数以及inner内部调用的fun函数均要与被装饰的函数在形式上保持一致(参数个数,顺序等)即:f()、inner()、fn()三者括号中的内容要保持一致。
2 一个装饰器可以装饰多个函数,多个装饰器可以装饰一个函数。
3 多个装饰器同时装饰一个函数的时候,执行顺序是这样的:
按与被装饰的函数的距离,由近到远执行