文章目录
110. python高级------闭包与装饰器(5)
python修炼第二十四天
2019年 4月 23日 晴
1. 装饰器的定义
就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。
装饰器的功能特点:
- 不修改已有函数的源代码
- 不修改已有函数的调用方式
- 给已有函数增加额外的功能
# 第一步闭包
# 第二步@语法糖
def set_fun(func): # 这个就是传入要被装饰的函数名或者叫引用
def call_fun():
print(func)
# 调用原先的函数
func()
return call_fun
@set_fun # @set_fun ===> test = set_fun(test)
def test():
print("test")
test()
说明:
2.通用装饰器的推导
- 函数有以下几种情况
- 无参,无返回
- 无参,有返回
- 有参,无返回
- 有参,有返回
无参,无返回
#############无参,无返回##############
# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)
def set_fun(func):
def call_fun():
print("额外的功能")
# 调用原先的函数
func()
return call_fun
@set_fun # @set_fun ===> test = set_fun(test)
def test():
print("test")
test()
无参,有返回
#########无参,有返回########
# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)
# 3.装饰器的道德:是不会去更改原先函数的参数及返回值
def set_fun(func):
def call_fun():
print("额外的功能 ")
# 返回原先函数的值
return func()
return call_fun
@set_fun # @set_fun ===> test = set_fun(test)
def test():
return 9675543
value = test()
print(value)
有参,无返回
############有参,无返回########
# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)
# 3.装饰器的道德:是不会去更改原先函数的参数及返回值
def set_fun(func):
def call_fun(args):
print("额外的功能")
# 原先函数执行
func(args)
return call_fun
@set_fun # @set_fun ==> test = set_fun(test)
def test(args):
print(args)
test(123)
有参,有返回
###########有参,有返回#######
# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)
# 3.装饰器的道德:是不会去更改原先函数的参数及返回值
def set_fun(func):
def call_fun(args):
print("额外的功能")
return func(args)
return call_fun
@set_fun
def test(args):
return args
value = test(123)
print(value)
通用装饰器
#######通用装饰器########
# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)
# 3.装饰器的道德:是不会去更改原先函数的参数及返回值
# 装饰器
def set_fun(func):
def call_fun(*args, **kwargs):
print("call_fun", args)
print("call_fun", kwargs)
return func(*args, **kwargs) # 拆包
return call_fun
@set_fun # test = set_fun(test)
def test(*args, **kwargs):
print(args)
print(kwargs)
return 123
value = test(123, a=123)
print(value)