zoukankan      html  css  js  c++  java
  • 函数(八)-闭包与装饰器

    闭包和装饰器

    (一) 闭包

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

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

  • 相关阅读:
    记录时间开销的好处
    jQuery实现轮播图效果
    读《论证是一门学问》
    sqrt.java
    关于perl:Fatal: failed to find source perl5db.pl for epic_breakpoints.pm解决方法
    JAVA基础——对象与引用概念(转载)
    对百度搜索看法的转变
    C输出格式——转载
    Java static关键字与静态块
    简单js实现弹出登陆框div层,背景变暗不可操作
  • 原文地址:https://www.cnblogs.com/duxiangjie/p/14095760.html
Copyright © 2011-2022 走看看