使用场景:
eg:要求调用每个方法前都要打印该函数的名称
普通方式,每个方法里面都得写一遍,显得low
def test1():
print "function name=>>>", test1.__name__
pass
def test2():
print "function name=>>>", test2.__name__
pass
使用装饰器:
def myfun(fn):
def warpper():
print "function name=>>>", fn.__name__
return fn()
return warpper
@myfun
def test3():
print "cz9025"
这是最简单的装饰器,但是有一个问题,如果被装饰的函数需要传入参数,那么这个装饰器就坏了。因为返回的函数并不能接受参数,你可以指定装饰器函数wrapper接受和原函数一样的参数,还好Python提供了可变参数*args和关键字参数**kwargs,有了这两个参数,装饰器就可以用于任意目标函数了。比如:
def myfun(fn):
def warpper(*args,**kwargs):
print "function name=>>>", fn.__name__
return fn(*args,**kwargs)
return warpper
高级一点的,带参数的装饰器
def logging(level):
def myfun(fn):
def warpper(*args,**kwargs):
print "[{}],function name=>>>{}".format(level,fn.__name__)
return fn(*args,**kwargs)
return warpper
return myfun
@logging('info')
def test3():
print "hello"
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
参考文章:https://www.cnblogs.com/cicaday/p/python-decorator.html