python 中的装饰器
作者:互联网
在写程序时,有时可能需要对某个函数增加些新的功能,但是又不能改原函数,这时,我们就需要用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
"""
标签:__,function,python,原函数,func,print,装饰,def 来源: https://blog.csdn.net/qq_53224891/article/details/121295901