Python decorator
简介:
Python 的修饰符(decorator)“@”是个很方便的东西。它将目标函数作为参数处理,再返回处理过的结果。
Python 也自带很多修饰符 如@classmethod 等。 这里介绍自定义修饰的实现方法。
一般分两种实现方法: 方法实现、类实现
方法实现
这里举两个通用方法实现。
- decorator不带参数:
逻辑: [decorated] foo(‘Hello’) => decorator(foo)(‘Hello’) => wrapper(‘Hello’) => [real] foo(‘Hello’)
def decorator(func):
def wrapper(*args,**kwargs):
print "Decorator: Enter Wrapper..."
print "Decorator: function: %s"%func.__name__
func(*args,**kwargs)
return wrapper
@decorator
def foo(say):
print "foo: Enter foo"
print "foo: Say %s"%say
if __name__ == "__main__":
foo("Hello!")
- decorator 带参数:
逻辑: 其实就是无参数的外面多包裹一层
def decorator(goodbye = False):
def wrapper1(func):
print "Decorator: Enter wrapper1..."
def wrapper2(*args,**kwargs):
print "Decorator: Enter Wrapper2..."
print "Decorator: function: %s"%func.__name__
func(*args,**kwargs)
if goodbye:
print "Decorator: Good bye!"
return wrapper2
return wrapper1
@decorator(goodbye = True)
def foo(say):
print "foo: Enter foo"
print "foo: Say %s"%say
类实现
其实个人觉得方法实现已经很够用了。 当然将类方法实现也推出来。
class ClassDecorator(object):
"""docstring for ClassDecorator"""
def __init__(self, func):
print "ClassDecorator: Enter __init__"
self.func = func
def __call__(self,*args,**kwargs):
print "ClassDecorator: Enter __call__"
return self.func(*args,**kwargs)
@ClassDecorator
def foo(say):
print "foo: Enter foo"
print "foo: Say %s"%say
if __name__ == "__main__":
foo("Hello!")
参考资料:
http://www.cnblogs.com/Jerry-Chou/archive/2012/05/23/python-decorator-explain.html
http://blog.youkuaiyun.com/shangliuyan/article/details/8555991
https://www.python.org/dev/peps/pep-0318/
http://blog.youkuaiyun.com/openxmpp/article/details/8779691