闭包函数和装饰器
闭包函数(重要)
1. 闭:定义在函数内部的函数
2. 包:内部函数使用了外部函数名称空间中的名字
eg:
def outer ():
x = 1
def inner ():
print (x)
return inner
res = outer()
res()
运行结果:
1
闭包函数实际应用
eg:
def outer (x ):
def inner ():
print (x)
return inner
res = outer(1 )
res()
运行结果:
1
装饰器简介
在不改变被装饰对象原有的'调用方式' 和'内部代码' 的情况下给被装饰对象添加新功能
对拓展开放
对修改封闭
import time
def index ():
time.sleep(3 )
print ('from index' )
'''给index函数增加了一个统计执行时间的功能'''
start_time = time.time()
index()
end_time = time.time()
print (end_time - start_time)
输出结果:
from index
3.004551887512207
简易版本装饰器
eg:
def outer (func_name ):
def inner ():
start_time = time.time()
func_name()
end_time = time.time()
print (end_time - start_time)
return inner
index = outer(index)
index()
运行结果:
from index
3.0023038387298584
完整版装饰器
上述简易版装饰器还有两个点有问题,我们回想函数的语法结构,可以看到,上述装饰器在index函数有参数传递和返回值时无法实现,完整版的装饰器其实就是解决了这两个问题
eg:
import time
def index (username ):
time.sleep(3 )
return username
def outer (func_name ):
def inner (*args, **kwargs ):
start_time = time.time()
res = func_name(*args, **kwargs)
end_time = time.time()
print (end_time - start_time)
return res
return inner
index = outer(index)
res = index('这里参数随便传,反正不报错' )
print (res)
运行结果:
3.0157086849212646
这里参数随便传,反正不报错
装饰器模板(重要)
其实根据上面的代码,把原函数不存在的功能全删了就是模板
def outer (func_name ):
def inner (*args, **kwargs ):
'''原函数被执行前的操作写这里'''
res = func_name(*args, **kwargs)
'''原函数被执行后的操作写这里'''
return res
return inner
装饰器语法糖
eg:
'''上接完整版装饰器'''
@outer
def my_age (age ):
time.sleep(3 )
return age
res = my_age(18 )
print (res)
运行结果:
3.0101282596588135
18
"""
语法糖内部原理
1.使用的时候最好紧跟在被装饰对象的上方
2.语法糖会自动将下面紧挨着的函数名传给@后面的函数调用
"""
装饰器修复技术
eg:
from functools import wraps
def outer (func_name ):
@wraps(func_name )
def inner (*args, **kwargs ):
print ('下面这货被装饰了' )
res = func_name(*args, **kwargs)
return res
return inner
@outer
def index ():
'''这是真函数的注释'''
print ('from index' )
index()
print (index)
help (index)
运行结果:
下面这货被装饰了
from index
<function index at 0x01592030 >
Help on function index in module __main__:
index()
这是真函数的注释
'''wraps模块warps关键字可以把真函数的属性提取出来,赋值给装饰器,达到以假乱真的地步'''
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)