zoukankan      html  css  js  c++  java
  • 闭包函数,装饰器

    闭包函数

    闭:定义在函数内部的函数
    包:内部函数引用了外部函数作用域的名字
    
     什么是闭包?
    #内部函数包含对外部作用域而非全局作用域的引用
    
    # 闭包的应用场景
    # 1.闭包中使用的变量可以被外层函数所传递 - 外层函数可以为闭包传递参数
    #闭包的意义:闭包函数返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,使该函数无论在何处调用,优先使用自己外层包裹的作用域

    开放封闭原则

    #开放封闭原则:对修改封闭,对扩展开放
    在不修改源代码与调用方式的情况下为函数添加新功能
    
    # 不能修改源代码原因
    1.无权修改 2.功能不特有 3.修改的位置多个,需要一一修改
    
    # 不能修改原函数的调用方式 
    因为修改调用方式有弊端,会使原项目的所有函数调用都要修改

    装饰器

    装饰器:在不修改被装饰对象情况下,给被装饰对象添加新的功能的闭包应用
    因为开放封闭原则:
           开放:对扩展开放
           封闭:对修改封闭
    装饰器(可调用对象)必须遵循的两个原则:
            1.不改变被装饰对象源代码
            2.不改变被装饰对象(可调用对象)调用方式
    
    装饰器需要先定义再使用

    装饰器公式

    装饰器语法糖:会将紧挨着它的可调用对象的名字当做参数自动传入调用outter
    @outter
    def index():
        pass
    
    1.无参装饰器
        from functools import wraps
        def outter(func):
            @wraps(func)
            def inner(*args,**kwargs):  # * **在形参中使用
                # 执行被装饰函数之前你可以做的操作
                res = func(*args,**kwargs)  # * **在实参中使用
                # 执行被装饰函数之后你可以做到操作
                return res
            return inner
    
        @outter
        def index(username,*args,**kwargs):
            """index注释"""
            pass
        print(index)
    
        装饰器修复技术
    
            1.返回原来的函数的函数名
            2.返回原来的函数的注释
    
    2.有参装饰器(最复杂就三层)
    def wrappers(data):
        # data = 'file'
        def outter(func):
            def inner(*args,**kwargs):
                if data == 'file':
                    # 执行被装饰函数之前你可以做的操作
                    res = func(*args,**kwargs)  # * **在实参中使用
                    # 执行被装饰函数之后你可以做到操作
                    return res
            return inner
        return outter
  • 相关阅读:
    服务器负载均衡的基本功能和实现原理
    二分查找
    TCP的运输连接管理
    linux常用命令
    XX公司在线笔试题编程题之一
    java对象转json格式
    Java多线程并发技术
    进程同步与通信
    单例模式的C++实现
    rsyncd启动脚本
  • 原文地址:https://www.cnblogs.com/george-007/p/11176768.html
Copyright © 2011-2022 走看看