1、装饰器
装饰器(Decorator
):从字面上理解,就是装饰对象的器件。可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出。
装饰器的特点是特点是函数是作为其参数出现的,装饰器还拥有闭包的特点。
示例代码如下所示:
# 定义一个装饰器 def decorate(func): def wrapper(): func() print("已将学生加入学校学生名单") print("已将学生加入系学生名单") print("已将学生加入班级名单") return wrapper @decorate def student(): print("我是小花") student() ''' ---输出结果--- 我是小花 已将学生加入学校学生名单 已将学生加入系学生名单 已将学生加入班级名单 '''
使用**@
****符号加函数名**来装饰一个函数
执行流程:因为student
是被装饰的函数,系统将student
函数以参数的形式传入decorate
函数(装饰器decorate
),执行decorate
函数,并将返回值赋给student
函数。
上一段代码等于下面这一段代码:
# 定义一个装饰器 def decorate(func): def wrapper(): func() print("已将学生加入学校学生名单") print("已将学生加入系学生名单") print("已将学生加入班级名单") return wrapper def student(): print("我是小花") # 将返回值传给f 并调用 f = decorate(student) # 这里不能加(),不然就表示调用 f() ''' ---输出结果--- 我是小花 已将学生加入学校学生名单 已将学生加入系学生名单 已将学生加入班级名单 '''
如果student
函数外有直接可执行的语句,在不调用student
函数的情况下,也会被执行,
示例代码如下:
# 定义一个装饰器 def decorate(func): print("这是外部的代码") def wrapper(): func() print("已将学生加入学校学生名单") print("已将学生加入系学生名单") print("已将学生<a style="color:transparent">本文来源gao($daima.com搞@代@#码(网5</a>加入班级名单") return wrapper @decorate def student(): print("我是小花") # student() ''' ---输出结果--- 这是外部的代码 '''
1.1 应用场景
可以用于电商网站的判断用户是否登录来是否继续往下执行;添加日志等场景,
示例代码如下所示:
# 定义一个装饰器 def decorate(func): def wrapper(): func() print("正在检验用户是否登录") # if # 判断是否登录的代码块 # pass print("用户已登录") return wrapper @decorate # 使用装饰器 def add_shopping_cart(): print("添加成功") @decorate # 使用装饰器 def payment(): print("付款成功") add_shopping_cart() payment() ''' ---输出结果--- 添加成功 正在检验用户是否登录 用户已登录 付款成功 正在检验用户是否登录 用户已登录 '''