使用类装饰器可以实现带参数装饰器的效果,但实现的更加优雅简洁,而且可以通过继承来灵活的扩展.
1、类装饰器
----------欢迎加入我的python新手交流群851211580------------
1 class loging(object):
2 def __init__(self,level="warn"):
3 self.level = level
4 def __call__(self,func):
5 @functools.wraps(func)
6 def _deco(*args, **kwargs):
7 if self.level == "warn":
8 self.notify(func)
9 return func(*args, **kwargs)
10 return _deco
11 def notify(self,func):
12 # logit只打日志,不做别的
13 print "%s is running" % func.__name__
14 @loging(level="warn")#执行__call__方法
15 def bar(a,b):
16 print('i am bar:%s'%(a+b))
17 bar(1,3)
2、继承扩展类装饰器
1 class email_loging(Loging):
2 '''
3 一个loging的实现版本,可以在函数调用时发送email给管理员
4 '''
5 def __init__(self, email='admin@myproject.com', *args, **kwargs):
6 self.email = email
7 super(email_loging, self).__init__(*args, **kwargs)
8 def notify(self,func):
9 # 发送一封email到self.email
10 print "%s is running" % func.__name__
11 print "sending email to %s" %self.email
12 @email_loging(level="warn")
13 def bar(a,b):
14 print('i am bar:%s'%(a+b))
15 bar(1,3)