函数装饰器 decorator
1. 定义:在不改变原函数的调用以及内部代码情况下,为其添加新功能的函数。
2. 语法
def 函数装饰器名称(func):
def wrapper(*args, **kwargs):
需要添加的新功能
return func(*args, **kwargs)
return wrapper
原函数 = 内嵌函数
@ 函数装饰器名称
def 原函数名称(参数):
函数体
原函数(参数)
3. 本质:使用“@函数装饰器名称”修饰原函数,等同于创建与原函数名称相同的变
量,关联内嵌函数;故调用原函数时执行内嵌函数。 原函数名称 = 函数装饰器名称(原函数名称)
4. 装饰器链: 一个函数可以被多个装饰器修饰,执行顺序为从近到远。
装饰器 在不改变旧功能基础上,增加新功能 核心逻辑: 拦截调用
"""
def func01():
print("旧功能")
def new_func():
print("新功能")
"""
"""
def func01():
print("旧功能")
def new_func(func): # 得旧功能
def wrapper(): # 用新旧功能
print("新功能")
func()
return wrapper
# 新功能覆盖了旧功能
# func01 = new_func
# 调用一次外部函数
func01 = new_func(func01)
# 调用多次内部函数
func01()
func01()
"""
def new_func(func): # 得旧功能
def wrapper(): # 用新旧功能
print("新功能")
func() # 3.执行旧功能
return wrapper
# 1.调用外部函数
@new_func # func01 = new_func(func01)
def func01():
print("旧功能")
# 2.调用内部函数
func01()
func01()
练习1:不改变插入函数与删除函数代码, 为其增加验证权限的功能
def verify_permissions(func):
def wrapper():
print("验证权限")
func()
return wrapper
# insert = verify_permissions(insert)
@verify_permissions
def insert():
print("插入")
@verify_permissions
def delete():
print("删除")
insert()
delete()
装饰器 - 语法细节 内函数返回值:旧功能的返回值
def new_func(func):
def wrapper(*args, **kwargs): # 多合一
print("新功能")
result = func(*args, **kwargs) # 一拆多
return result
return wrapper
@new_func
def func01(p1):
print("旧功能1,参数:", p1)
return 10
@new_func
def func02(p1, p2):
print("旧功能2,参数:", p1, p2)
return 20
# 调用内函数
print(func01(100)) # 10
print(func02(200, 300)) # 20
func02(p1=400, p2=500)
# 练习1:不改变插入函数与删除函数代码,
# 为其增加验证权限的功能
def verify_permissions(func):
def wrapper(*args, **kwargs):
print("验证权限")
return func(*args, **kwargs)
return wrapper
# insert = verify_permissions(insert)
@verify_permissions
def insert(p1):
print("插入")
return "ok"
@verify_permissions
def delete():
print("删除")
return "no"
print(insert(10))
print(delete())
练习 2:为 sum_data,增加打印函数执行时间的功能.
函数执行时间公式: 执行后时间 - 执行前时间
def sum_data(n):
sum_value = 0
for number in range(n):
sum_value += number
return sum_value print(sum_data(10))
print(sum_data(1000000))
import time
def print_execute_time(func):
def wrapper(*args, **kwargs):
start = time.time()
# 执行旧功能
result = func(*args, **kwargs)
stop = time.time()
print("执行时间:", stop - start)
return result
return wrapper
@print_execute_time
def sum_data(n):
sum_value = 0
for number in range(n):
sum_value += number
return sum_value
print(sum_data(10))
print(sum_data(1000000))