"""
装饰器
"""
"""
# 新增功能:
def print_func_name(func):
print(func.__name__)
# 已有方法:
def say_hello():
print("hello")
print_func_name(say_hello)
def say_goodbye():
print("goodbye")
print_func_name(say_goodbye)
"""
# --------------在不改变原有功能代码以及调用功能代码的基础上,增加新功能----------
# ---------------------------第一步------------------------
# 新增功能:
def print_func_name(func):
def wrapper():
print(func.__name__) # 新增功能
return func() # 原始功能
return wrapper
# 已有方法:
def say_hello():
print("hello")
def say_goodbye():
print("goodbye")
# say_hello / say_goodbye 得到的是内嵌函数 wrapper
say_hello=print_func_name(say_hello)
say_goodbye=print_func_name(say_goodbye)
say_hello()
say_goodbye()
# ----------------------------第二部(无参数)------------------------
# 新增功能:
def print_func_name(func):
def wrapper():
print(func.__name__)
return func()
return wrapper
# 已有方法:
@print_func_name # say_hello=print_func_name(say_hello)
def say_hello():
print("hello")
@print_func_name # say_goodbye=print_func_name(say_goodbye)
def say_goodbye():
print("goodbye")
say_hello()
say_goodbye()
# 装饰器:目的:
# 拦截对被装饰方法的调用
# ----------------------------第三步(有参数)------------------------
# 新增功能:
def print_func_name(func):
def wrapper(*args,**kwargs):
print(func.__name__)
return func(*args,**kwargs)
return wrapper
# 已有方法:
@print_func_name
def say_hello(name):
print(name,"hello")
@print_func_name
def say_goodbye(name):
print(name,"goodbye")
say_hello("张三疯")
say_goodbye("小小")
# 装饰器链
# 一个函数可以被多个装饰器修饰,执行顺序为从近到远
练习 1:在现有功能是,增加验证权限
def verify_permissions(func):
def wrapper(*args, **kwargs):
print("验证权限")
return func(*args, **kwargs)
return wrapper
@verify_permissions
def enter_background():
print("进入后台系统...")
@verify_permissions
def delete_order(order_id):
print("删除订单", order_id)
enter_background()
delete_order(101)
练习 2:计算某个程序运行时间
import time
def timer(func):
def wrapper(*args, **kwargs):
time_start = time.time()
result = func(*args, **kwargs)
time_end = time.time()
print("执行时间:%ds" % (time_end - time_start))
return result
return wrapper
@timer
def fun01():
print("fun01")
time.sleep(2)
@timer
def fun02():
print("fun02")
time.sleep(1.5)
fun01()
fun02()