闭包函数,装饰器
闭包函数
闭:定义在函数内部的函数 包:内部函数引用了外部函数作用域的名字 什么是闭包? #内部函数包含对外部作用域而非全局作用域的引用
# 闭包的应用场景
# 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