简介
装饰器实质上是一个函数,它把一个函数作为输入并且返回给另一个函数;主要作用于在不改变源代码的情况下,修改已经存在的函数,使函数增加新的功能
装饰器-高阶函数1
函数可以赋值给变量,即:变量可以指向函数
既然变量可以指向函数,函数的参数能接受变量,那么一个函数就能接收另一个“函数名”作为参数,这种函数就称之为高阶函数
def function(func):#接收一个函数名,这个函数名其实就相当函数的地址,通过这个函数名加上一对括号()就可以运行这个函数,如下面第四行
print("夜晚即将来临")#装饰器新增的功能
func()#===========>相当于z_func()
def z_func():#z_func代表的是主函数
print("夜空中最亮的星")
function(z_func)#相当于向function传递了z_func的地址
装饰器-高阶函数1.2
def function(func):#这个func相当函数的地址,并不具实体意思,如十七行
print("夜晚即将来临")#装饰器新增的功能
print(func)
return func#返回func的地址
def z_func():
print("夜空中最亮的星")
z_func = function(z_func)#左边的z_func是一个新的变量,接收来自function的返回值,其实接收的是旧的z_func函数的地址,新的z_func通过加上()又可以运行旧的z_func函数了
z_func()
装饰器-嵌套函数1
函数的嵌套是指在一个函数内又新定义一个函数,而不是直接调用另一个函数
def foo(hh):
print("in the foo")
def bar():
print("in the bar")
print(hh)#这里的hh相当于全局变量,可以在子函数内任意调用
bar()#调用foo函数里定义的函数
foo("hh")#调用foo
装饰器-嵌套函数1.2
def foo(hh):
print("in the foo")
def bar():
print("in the bar")
print(hh)#这里的hh相当于全局变量,可以在子函数内任意调用
return bar#返回bar的地址
test = foo("hh")#接收子函数bar的地址
test()
装饰器-高阶函数加嵌套函数
def deco(funcTest):#等价于funcTest = func
def function():
print("夜晚即将来临")
funcTest()#========>func()
return function#相当于加上新功能的func
def func():
print("夜空中最亮的星")
func = deco(func)
func()
装饰器-初步
def deco(funcTest):#等价于funcTest = func
def function():
print("夜晚即将来临")
funcTest()#========>func()
return function#相当于加上新功能的func
@deco#相当于func = deco(func)
def func():
print("夜空中最亮的星")
func()
装饰器-进阶
def deco(funcTest):#等价于funcTest = func,应该是传递地址时,同时也将该函数的信息传递过去了包括它的实参
def funcDeco(*args, **kwargs):
print("夜晚即将来临")
funcTest(*args, **kwargs)#========>func()
return funcDeco
@deco#相当于func = deco(func)
def func(temp):#带参数
print("夜空中最亮的星")
print("in the func", temp)
func("星星真好看")
装饰器-终极版
def deco(deco_type):
print("------->>>>", deco_type)
def outer_wrapper(funcTemp):
print("--------->>>>", funcTemp)
def wrapper(*args, **kwargs):
print("----------->>>>", *args, **kwargs)
print("夜晚即将来临")
print("---------------->>>>'deco_type' = %s 是局部变量里的全局变量,因为它位于顶层的函数内"% deco_type)
return funcTemp(*args, **kwargs)#funcTemp()相当于func(),因为func()可能有返回值,所以wrapper()函数也要添加一个返回值, 用于返回func()的返回值
return wrapper
return outer_wrapper
@deco(deco_type = "txt")#添加参数
def func(temp):
print(temp)
return "今晚的夜空真美"
print(func("夜空中最亮的星"))
本文深入探讨了Python中装饰器的概念及应用,从高阶函数到嵌套函数,再到装饰器的具体实现方式,最后介绍了如何使用装饰器来增强函数的功能。
127

被折叠的 条评论
为什么被折叠?



