[掌握]装饰器入门
语法糖
==目标:==掌握装饰器的快速使用。
装饰器本质上就是闭包,但装饰器有特殊作用,那就是:在不改变原有函数的基础上,给原有函数增加额外功能。
定义装饰器:
python
def outer([外面参数列表]):
def inner([内部参数列表]):
新增额外功能代码
....
...[引用]
return inner
使用装饰器的标准语法:
python
# 语法糖
@outer
def 函数名():
代码
...
例如,一起来完成:
(1)我们知道,发表评论前是需要先登录的;
(2)接着,先定义有发表评论的功能函数;
(3)使用语法糖方式,在不改变原有函数的基础上,提示用户要先登录~。
python
# 接下来,要对func函数进行增强,编写闭包
def outer(func):
def inner():
print('先要登录!')
func()
print('评论成功!')
return inner # inner函数本质上就是增强版的func函数
# 定义你要对哪个函数进行增强
@outer
def func():
print('发表评论!')
if __name__ == '__main__':
func()
==总结:==
(1)装饰器本质上就是闭包,作用是在不改变原有函数的基础上,给原有函数增加额外功能;
(2)要构成装饰器,要满足4个条件:有嵌套、有引用、有返回、()。==A、有额外功能==;B、有结果;
*传统方式
==目标:==了解装饰器的传统方式与执行流程。
定义装饰器:
python
def outer([外面参数列表]):
def inner([内部参数列表]):
新增额外功能代码
....
...[引用]
return inner
使用装饰器的传统方式语法:
传统方式
变量名 = outer([外面参数列表])
变量名([内部参数列表])
例如,一起来完成:
(1)我们知道,发表评论前是需要先登录的;
(2)接着,先定义有发表评论的功能函数;
(3)使用传统方式,在不改变原有函数的基础上,提示用户要先登录~;
(4)了解装饰器的执行流程。
python
# 接下来,要对func函数进行增强,编写闭包
def outer(func):
def inner():
print('先要登录!')
func()
print('评论成功!')
return inner # inner函数本质上就是增强版的func函数
# 定义你要对哪个函数进行增强
def func():
print('发表评论!')
if __name__ == '__main__':
inner_func = outer(func)
inner_func()
==总结:==
(1)使用装饰器时,应该优先考虑使用:();==A、语法糖==;B、传统方式;
(2)为了更好的了解装饰器的执行流程,可以通过装饰器的传统方式来了解。
[了解]函数分类
==目标:==了解函数的分类有哪些?
对于函数的使用,可以根据有无参数、有无返回值来进行分类。分为:
(1)无参无返回值的函数
(2)有参无返回值的函数
(3)无参有返回值的函数
(4)有参有返回值的函数
无参无返回值的函数的语法:
定义
def 函数名():
代码
...
调用
函数名()
有参无返回值的函数的语法:
定义
def 函数名(参数1, 参数2, ...):
代码
...
调用
函数名(值1, 值2, ...)
无参有返回值的函数的语法:
定义
def 函数名():
代码
...
return 值
调用
变量名 = 函数名()
有参有返回值的函数的语法:
定义
def 函数名(参数1, 参数2, ...):
代码
...
return 值
调用
变量名 = 函数名(值1, 值2, ...)
==总结:==(1)我们会发现,函数的分类有4种,那么对应于装饰器也有4种;
(2)注意:对函数来分类,主要是根据有无参数和返回值来划分的。
[掌握]装饰无参无返回值的函数
==目标:==掌握如何装饰无参无返回值的函数。
当使用装饰器装饰无参无返回值的函数时,语法:
python
def outer(func):
def inner():
新增额外功能代码
....
...[引用]
return inner
例如,一起来完成:
(1)在给无参无返回值的原有函数求和计算结果之前;
(2)添加一个友好提示(注意:不能改变源码):正在努力计算中...
python
# 1.定义装饰器
def outer(func):
def inner(): # 有嵌套
print("=======正在努力计算中...========") # 有额外功能
func() # 有引用
return inner # 有返回
# 2.使用装饰器
# 3.定义函数
@outer
def get_sum():
a = 10
b = 23
sum = a + b
print(f"两数之和为:{sum}")
# 4.调用函数
get_sum()
==总结:==
(1)当被装饰的函数没有参数时,对应定义的装饰器的内部函数也没有参数;
(2)注意:当被装饰的函数没有返回值时,对应定义的装饰器的内部函数也没有返回值.。
[掌握]装饰有参无返回值的函数
==目标:==掌握如何装饰有参无返回值的函数。
当使用装饰器装饰有参无返回值的函数时,语法:
def outer(func): def inner(参数1, 参数2, ...): 新增额外功能代码 .... ...[引用] return inner
例如,一起来完成:
(1)在给有参无返回值的原有函数求和计算结果之前;
(2)添加一个友好提示(注意:不能改变源码):正在努力计算中...。
def outer(func):
def inner(x,y): # 有嵌套
==总结:==(1)请问:当被装饰的原有函数有参数时,装饰器的内部函数也有对应个数的参数,这句话正确吗?==A、正确==;B、错误。
[掌握]装饰无参有返回值的函数
==目标:==掌握如何装饰无参有返回值的函数。
当使用装饰器装饰无参有返回值的函数时,语法:
def outer(func): def inner(): 新增额外功能代码 .... ...[引用] return 值 # 要返回值 return inner
例如,一起来完成:
(1)在给无参有返回值的原有函数求和计算结果之前;
(2)添加一个友好提示(注意:不能改变源码):正在努力计算中...。
python
# 1.定义装饰器
def outer(func):
def inner():
print("=====正在努力计算中...")
result = func()
return result
return inner
# 2.使用装饰器
# 3.定义函数
@outer
def get_sum():
a = 19
b = 23
sum = a + b
return sum
# 4.调用函数
print(get_sum())
==总结:==
(1)当原有函数有返回值时,记住:装饰器的内部函数也需要返回结果,否则没有输出效果。
[掌握]装饰有参有返回值的函数
==目标:==掌握如何装饰有参有返回值的函数。
当使用装饰器装饰有参有返回值的函数时,语法:
def outer(func): def inner(参数1, 参数2, ...): 新增额外功能代码 .... ...[引用] return 值 # 要返回值 return inner
例如,一起来完成:
(1)在给有参有返回值的原有函数求和计算结果之前;
(2)添加一个友好提示(注意:不能改变源码):正在努力计算中...。
python
# 接下来,要对func函数进行增强,编写闭包
def outer(func):
def inner(a,b): #被增强的函数func,有两个参数,则这里的inner也必须有两个参数,因为inner是增强版的func
print('求和前!')
result = func(a,b)
return result # 被增强函数有返回值,这里也必须有返回值 这里的return,一般返回被增强函数的返回值
return inner # inner函数本质上就是增强版的func函数
# 定义你要对哪个函数进行增强
@outer
def func(a,b): # 有参无返回值
return a+b
if __name__ == '__main__':
result = func(10,20)
print(result)
==总结:==
(1)当被装饰的原有函数有参有返回值时,定义的装饰器类型应该在内部函数中要有参数,也要有返回值;
(2)当要构成装饰器的条件时,需要满足:有嵌套、有引用、()、有额外功能。==A、有返回==;B、有装饰;