装饰器就是在不做任何代码变动的前提下去增加额外的功能,python中装饰器的本质是一个函数。主要应用于 插入日志,性能测试,事务处理,缓存,权限校验等场景。是一种aop编程思想,装饰器在使用中可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
先看一个简单的函数:
def hello(): print "见到你很高兴"如果现在要求给函数加一个运行日志,可以这样加
def hello(): print "见到你很高兴" print "hello is called !"这样看起来是没有错的,但是如果是给一百个函数加上日志呢?如果日志不是简单的一句话而是相同的很多的代码实现呢? 有了装饰器,可以这样写:
def loging(func): func() print "%s is called !"%func.__name__ loging(hello)这样将一个函数作为参数传到另一个函数中的思想就是装饰器思想。这样无论有多少个函数需要加日志只需要这一个函数就行了,当然这还并不是一个合格的装饰器,因为这种方式实际上已经破坏了原有的代码结构。我们继续往下走:
def loging(func): def wrapper(name): print "%s is called !"%func.__name__ return fun(name) return wrapper @loging def hello(name): print "%s,早上好"%name hello("wk")说到这里,可能大家已经会简单的使用装饰器了,但是更复杂一点的需要参数传递的还需要再了解一下 代码还是上面的代码:
def loging(func): def wrapper(*args,**kwargs): print "我接收到了函数的参数%s,%s"%(args,kwargs) print "%s is called !"%func.__name__ return fun(*args,**kwargs) return wrapper @loging def hello(*args,**kwargs): print "aaa,早上好" hello("参数一",c2="canshu2")上面的例子是参数的传递,下面再说一说带参数的装饰器:
def @log1(ave): def log2(func): def wrapper(*args) if ave="pass":pass else:print "%s is called !"%func.__name__ return func(*args) return wrapper return log2 @log1("no") def hello(*args): print "aaa,早上好"下面来看看类装饰器
class Foo(object): def __init__(self, func): self._func = func def __call__(self): print ('class decorator runing') self._func() print ('class decorator ending') @Foo def bar(): print ('bar') bar()