这篇文章主要介绍“Python装饰器的相关知识点有哪些”,在日常操作中,相信很多人在Python装饰器的相关知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python装饰器的相关知识点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
装饰器(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("已将学生加入班级名单") return wrapper @decorate def student(): print("我是小花") # student() ''' ---输出结果--- 这是外部的代码 '''
可以用于电商网站的判断用户是否登录来是否继续往下执行;添加日志等场景,
示例代码如下所示:
# 定义一个装饰器 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() ''' ---输出结果--- 添加成功 正在检验用户是否登录 用户已登录 付款成功 正在检验用户是否登录 用户已登录 '''
因为函数的参数可能是不固定的,所以可以通过函数的可变参数来完成这种功能。
示例代码如下:
def decorate(func): def wrapper(*args, **kwargs): # 使用可变参数来达到可以接受任何参数的效果 print("正在检测中。。。") print(".............") print("检测完毕") func(*args, **kwargs) return wrapper @decorate # 使用装饰器 def f1(): # 无参数 print("这个没有任何功能") @decorate def f2(name): # 一个参数 print("名字是:", name) @decorate def student(*students): # 多个参数 # *students用于接收多个参数 for ch in students: print(ch) @decorate def student_classroom(*students, classroom="前端班"): # 接收可以赋值的参数 print(f"这是{classroom}的学生") for ch in students: print(ch) # 调用函数 f1() ''' ---输出结果--- 正在检测中。。。 ............. 检测完毕 这个没有任何功能 ''' f2("一碗周") ''' ---输出结果--- 正在检测中。。。 ............. 检测完毕 名字是: 一碗周 ''' student("张三", "李四", "王五") ''' ---输出结果--- 正在检测中。。。 ............. 检测完毕 张三 李四 王五 ''' student_classroom("张三", "李四", "王五", classroom="前端班") ''' 正在检测中。。。 ............. 检测完毕 这是前端班的学生 张三 李四 王五 '''
为了防止错误,在定义装饰器的时候要将其设置为万能装饰器
多层的执行循序执行顺序是从里到外,最先调用最里层的装饰器,最后调用最外层的装饰器,
示例代码如下所示:
def maths(func): # 定义第一个装饰器 def wrapper(*args, **kwargs): func(*args, **kwargs) print("该学生已经学习了数学") return wrapper def Chinese(func): # 定义第而个装饰器 def wrapper(*args, **kwargs): func(*args, **kwargs) print("该学生已经学习了语文") return wrapper def English(func): # 定义第三个装饰器 def wrapper(*args, **kwargs): func(*args, **kwargs) print("该学生已经学习了英语") return wrapper @maths @English def student1(name): print(f"学生{name}已经完成了") @English @Chinese @maths def student2(name): print(f"学生{name}已经完成了") # 调用函数 student1("小明") ''' 学生小明已经完成了 该学生已经学习了英语 该学生已经学习了数学 ''' student2("小花") ''' 学生小花已经完成了 该学生已经学习了数学 该学生已经学习了语文 该学生已经学习了英语 '''
带参数的装饰器一共分为三层,分别如下:
第一层:负责接收装饰器的参数
第二层 :负责接收函数
第三层:负责接收函数的参数
示例代码如下所示:
# 装饰器带参数 def outer(a): # 第一层: 负责接收装饰器的参数 def decorate(func): # 第二层 : 负责接收函数 def wrapper(*args, **kwargs): # 第三层 负责接收函数的参数 for i in range(a): print(i) func(*args, **kwargs) return wrapper # 返出来的是:第三层 return decorate # 返出来的是:第二层 @outer(3) def number(): print("打印完毕") number() ''' 0 1 2 打印完毕 '''
最外层的函数负责接收装饰器参数,里面的内容还是原装饰器的内容。
到此,关于“Python装饰器的相关知识点有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。