闭包函数,装饰器

闭包函数

闭:定义在函数内部的函数
包:内部函数引用了外部函数作用域的名字

 什么是闭包?
#内部函数包含对外部作用域而非全局作用域的引用
# 闭包的应用场景
# 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

 

posted @ 2019-07-12 16:18  浅墨灬清风  阅读(164)  评论(0编辑  收藏  举报