装饰器
装饰器的作用:是在不改变函数功能的基础上添加某项功能。
- 不带参数的装饰器:
简单的闭包函数,格式:装饰器嵌套wrapper()函数
def buy_online(func):
def wrapper():
print("线上生鲜到家买买买")
func()
return wrapper
@buy_online
def cooking():
print("洗菜")
print("宽油下锅")
print("下菜落锅")
print("加调味料")
print("耐心翻炒")
print("尝尝味道")
print("装碟")
cooking()
- 带参数的装饰器:
格式:传参装饰器嵌套处理参数的函数嵌套wrapper(*args,**kwargs)函数
def buy_online(mall):
def which_mall_online(func):
def wrapper(*args, **kwargs):
print("'{}' 线上生鲜到家 买买买".format(mall))
func(*args, **kwargs)
return wrapper
return which_mall_online
@buy_online('每日优鲜')
def cooking(*args, **kwargs):
print("洗菜")
print("宽油下锅")
print("下菜落锅")
print("加调味料")
print("耐心翻炒")
print("尝尝味道")
print("装碟")
- 装饰器兼容是否传参
在传参装饰器上面添加传参和不传参选项,在函数内部进行装饰器判断,其他写法与传参函数相同
ef buy_online(decorated_func=None, mall=None):
if decorated_func and mall:
raise Exception('被装饰器装饰的函数和装饰器的参数不会在同一处出现')
def which_mall_online(func):
def wrapper(*args, **kwargs):
nonlocal mall
if mall == None:
mall = ''
print("{} 线上生鲜到家 买买买".format(mall))
func(*args, **kwargs)
return wrapper
if decorated_func:
# 如果是传递了被装饰的函数,则直接返回最内层wrapper函数
return which_mall_online(decorated_func)
else:
# 进入这里,说明是装饰器是有参数或使用默认参数的,返回外层函数
return which_mall_online
@buy_online(mall='饿了么生鲜')
def cooking(*args, **kwargs):
print("洗菜")
print("宽油下锅")
print("下菜落锅")
print("加调味料")
print("耐心翻炒")
print("尝尝味道")
print("装碟")
@buy_online()
def cooking_default_parameter(*args, **kwargs):
print("洗菜")
print("宽油下锅")
print("下菜落锅")
print("加调味料")
print("耐心翻炒")
print("尝尝味道")
print("装碟")
@buy_online
def cooking_decorator_no_parameter(*args, **kwargs):
print("洗菜")
print("宽油下锅")
print("下菜落锅")
print("加调味料")
print("耐心翻炒")
print("尝尝味道")
print("装碟")
# 执行正常
cooking()
cooking_default_parameter()
cooking_decorator_no_parameter()
- 多个装饰器的执行顺序
多个装饰器时,定义时,从最靠近原函数的开始定义,执行时,从离原函数最远的开始执行。
@zero_stage
@kindergarten_stage
@primary_school_stage
@middle_school_stage
@high_school_stage
@university_stage
@social_stage
def peak_of_life():
print("走向人生巅峰?")
# 执行结果,这是装饰函数里面的打印变量
进入social_stage函数定义
进入university_stage函数定义
进入 high_school_stage函数定义
进入 middle_school_stage函数定义
进入primary_school_stage函数定义
进入kindergarten_stage函数定义
进入zero_stage函数定义
# 输出结果:这是wrapper函数里面的打印内容
还是个受精卵
懵懵懂懂进入了幼稚园
每天佩戴红领巾的小学生
上晚自习的初中生
一个月只能回一次家的高中生
从此知道了二进制的CS大学生
社会大学,深不可测
走向人生巅峰?