函数(八)-闭包与装饰器

闭包和装饰器

(一) 闭包

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 多个装饰器同时装饰一个函数的时候,执行顺序是这样的:

按与被装饰的函数的距离,由近到远执行

posted @ 2020-12-07 09:57  小杜打醋尢买布  阅读(79)  评论(0编辑  收藏  举报