本文主要介绍“Python装饰器的相关知识点有哪些”。在日常操作中,相信很多人对Python装饰器的相关知识点有所怀疑。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮助大家解答“Python装饰器有哪些相关知识点”的疑惑!接下来,请和边肖一起学习! 00-1010装饰器(Decorator):字面意思是装饰物品的装置。在不修改原代码的情况下,可以给修饰对象增加新的功能,也可以增加限制或帮助输出。 装饰器的特点是函数作为它们的参数出现,并且它们还具有闭包的特性。 示例代码如下所示: #定义一个装饰师。 def装修(功能): defwrapper(): func() 打印(学生已添加到学校学生列表中) 打印(学生已添加到系学生列表中) 打印(学生已添加到班级列表中) returnwrapper defstudent(): 印刷体(“我是小华”) -输出结果-。 我是小华。 将学生添加到学校学生列表中。 学生已被添加到该系的学生名单中。 学生已被添加到班级名单中。 用符号* * @ * * * * *加上函数名* *来修饰函数。 由于执行流程:学生是一个修饰函数,系统将学生函数以参数的形式传递给修饰函数,执行修饰函数,并将返回值赋给学生函数。 上一段代码等于下面这一段代码: #定义一个装饰师。 def装修(功能): defwrapper(): func() 打印(学生已添加到学校学生列表中) 打印(学生已添加到系学生列表中) 打印(学生已添加到班级列表中) returnwrapper defstudent(): 印刷体(“我是小华”) #将返回值传递给f并调用。 F=修饰(学生)#这里不能加(),否则意味着调用。 -输出结果-。 我是小华。 将学生添加到学校学生列表中。 学生已被添加到该系的学生名单中。 学生已被添加到班级名单中。 如果在学生函数之外有直接可执行的语句,它们也将在不调用学生函数的情况下执行。 示例代码如下: #定义一个装饰师。 def装修(功能): 打印(“这是外部代码”)

bsp;def wrapper():
 func()
 print( 已将学生加入学校学生名单 )
 print( 已将学生加入系学生名单 )
 print( 已将学生加入班级名单 )
 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()
---输出结果---
正在检验用户是否登录
用户已登录
正在检验用户是否登录
用户已登录
 

2、万能装饰器

因为函数的参数可能是不固定的,所以可以通过函数的可变参数来完成这种功能。

示例代码如下:

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)
# 调用函数
---输出结果---
正在检测中。。。
.............
这个没有任何功能
f2( 一碗周 )
---输出结果---
正在检测中。。。
.............
名字是: 一碗周
student( 张三 ,  李四 ,  王五 )
---输出结果---
正在检测中。。。
.............
student_classroom( 张三 ,  李四 ,  王五 , classroom= 前端班 )
正在检测中。。。
.............
这是前端班的学生
 

为了防止错误,在定义装饰器的时候要将其设置为万能装饰器

Python装饰器的相关知识点有哪些 第1张

3、多层装饰器

多层的执行循序执行顺序是从里到外,最先调用最里层的装饰器,最后调用最外层的装饰器,

Python装饰器的相关知识点有哪些 第2张

示例代码如下所示:

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( 小花 )
学生小花已经完成了
该学生已经学习了数学
该学生已经学习了语文
该学生已经学习了英语
 

4、带参数的装饰器

带参数的装饰器一共分为三层,分别如下: