首先理解Python的函数能像普通的对象一样能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值,可以被定义在另外一个函数内。
前面的文章已经对闭包做了介绍,再次进行延伸和理解一下装饰器,主要用于不在改变源代码的情况下进行添加功能,装饰器利用闭包来实现,一般和闭包一起使用。
装饰器返回一个函数对象,简单理解在原函数功能上又加入新功能并返回一个和原函数名相同的函数对象。
def funcout(func):
def funcIn(x,y):
func(x,y)#外部函数传入的参数test函数在内部函数的调用
addf()#新增功能函数
return funcIn
#闭包 外部无法直接访问内部函数 将一个函数当成参数传递进来 funcout(test)调用时返回一个函数对象 用一个变量接收函数对象的地址比如假设为ss
#ss(1,2) 调用的内部函数 func是传进来的函数test 此时func调用传入的函数 test需要两个参数 需要在内部函数中传参
def addf():
print("新增功能")
def test(a,b):
print("a=%s,b=%s"%(a,b))
ff =funcout(test)
ff(1,2)#调用函数
在上面代码将函数test 进行替换成下列调用方式 就是加了一个@符号 实现装饰器写法更简单
@funcout # 装饰器 相当于 test=func(test)
def test(a,b):
print("a=%s,b=%s"%(a,b))
test(1,2)#调用函数test 为装饰器的函数 增加新的功能之后的test
通用装饰器函数 对可变参数的处理
def funcout(func):
def funcIn(*args,**kwargs)
func(*args,**kwargs) #没有返回值时使用
addf()
return funcIn(*args,**kwargs) #内部函数的返回值 防止传入的函数有返回值 有返回值时使用
return funcIn
还可以定义多个装饰器 执行顺序是从里到外的。
@a
@b
@c
def f ():
等效于 f = a(b(c(f)))