装饰器的语法
在函数之前 + @ 装饰器的名字
装饰器作用
在不更改原功能函数内部代码,并且不改变调用方法的情况下为原代码添加新的功能
常见的定义形式
1、闭包(最常见的形式)
使用的场景:在不更改原功能函数代码的基础上,进行功能的扩展
通用的写法:
def decorate(func):
def wrapper(*args, **kwargs):
print("在原功能函数执行前扩展的代码1")
print("在原功能函数执行前扩展的代码2")
result = func(*args, **kwargs)
print("在原功能函数执行后扩展的代码1")
print("在原功能函数执行后扩展的代码2")
return result
return wrapper
2、普通函数
一般用于给被装饰的函数(类),进行属性添加或者修改
def decorate(func):
return func
3、类
装饰器的副作用
from functools import wraps
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("在原功能函数执行前扩展的代码1")
print("在原功能函数执行前扩展的代码2")
result = func(*args, **kwargs)
print("在原功能函数执行后扩展的代码1")
print("在原功能函数执行后扩展的代码2")
return result
return wrapper
@decorate
def work(a, b):
"""
:param a:参数a的描述
:param b: 参数b的描述
:return: 返回值的描述
"""
print("-----work-----")
print(work.__doc__)
print(work.__name__)
带参数的装饰器
from functools import wraps
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("在原功能函数执行前扩展的代码1")
print("在原功能函数执行前扩展的代码2")
result = func(*args, **kwargs)
print("在原功能函数执行后扩展的代码1")
print("在原功能函数执行后扩展的代码2")
return result
return wrapper
def add_name(name):
print("参数name的值为:", name)
return decorate
@add_name('小明')
def work(a, b):
return a + b
work(1, 2)
print("参数name的值为:", name)
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("在原功能函数执行前扩展的代码1")
print("在原功能函数执行前扩展的代码2")
result = func(*args, **kwargs)
print("在原功能函数执行后扩展的代码1")
print("在原功能函数执行后扩展的代码2")
return result
return wrapper
return decorate
@add_name('小明')
def work(a, b):
return a + b
work(1, 2)
实例1
实现一个可以统计任意函数执行时间的装饰器
import time
def count_time(func):
"""
:param func:接受到的是被装饰的函数
:return:
"""
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print("执行时间为:", end_time - start_time)
return wrapper
@count_time
def work1():
for i in range(3):
time.sleep(1)
print("-----work1-----执行完毕")
@count_time
def work2():
for i in range(2):
time.sleep(1)
print("-----work2-----执行完毕")
work1()
work2()
实例2
def deco(func):
func.name = "小柠檬"
return func
@deco
def work():
print("123456")
print(work.name)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)