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