在写程序时,有时可能需要对某个函数增加些新的功能,但是又不能改原函数,这时,我们就需要用python里的装饰器来原函数增加新功能而不修改原函数。
推荐一篇好的博客nudt_qxx
-----------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------------------
总之python里的装饰器就是在不修改原函数的前提下,对原函数增添一些新的功能,这样就提高了程序的可扩展性。
#python 的装饰器 def test(func): def function(): print("1111~~~") func() print("aaaa~~~2222") return function @test def digtest(): pass if __name__=='__main__': digtest() """ 1111~~~ aaaa~~~2222 """
这是一个简单的函数装饰器,我们对digtest函数增加了新的功能,使得digtest函数可以输出打印。而test就是digtest的装饰器,装饰器参数是函数,且它的返回值也是一个函数,装饰器的传入的参数是要增添新功能的原函数,而它的返回值则是增添了新功能的新的函数。对于要修改的原函数,我们要在原函数的前面加上@(装饰器的函数名)
装饰器还可以对多个参数或者不定多个参数的原函数增加
def test(func): def function(*args,**kwargs): func(*args,**kwargs) print("function~~~acg") return function @test def digtest1(a,b): print("%d"%(a*b)) print("digtest1~~~acg") @test def digtest2(a,b,c,d): print("%d"%(a+b+c+d)) print("digtest2~~~acg") if __name__=='__main__': digtest1(2,3) digtest2(1,2,3,4) """ 6 digtest1~~~acg function~~~acg 10 digtest2~~~acg function~~~acg """
对*args ,**kwargs 不熟悉的可以去看一下这篇博客辰兮要努力
一个原函数可以有多个装饰器
def test1(func): def function(): func() print("aaaa~~~2233") return function def test2(func): def function(): func() print("bbbb~~~2233") return function @test1 @test2 def digtest(): print("cccc~~~2233") if __name__=='__main__': digtest() """ cccc~~~2233 bbbb~~~2233 aaaa~~~2233 """
当原函数有多个装饰器时,各个装饰器和原函数的执行顺序为
def test1(func): def func1(): print("1111") func() print("aaaa") return func1 def test2(func): def func2(): print("2222") func() print("bbbb") return func2 def test3(func): def func3(): print("3333") func() print("cccc") return func3 """如果修饰器修改的新函数功能在原函数功能的上面,则执行时按照修饰器的@表示顺序从上到下的执行,然后再执行原函数,反之如果修饰器修改的新函数的功能在原函数的下面,则执行时按照修饰器的@表示顺序从下到到上的执行,然后再执行原函数""" @test3 @test2 @test1 def test(): print("dddd") if __name__=='__main__': test() """ 3333 2222 1111 dddd aaaa bbbb cccc """