Python decorator
function decorator:语法:
@decoratorname
def decoratoredfunction
例如:
python 代码
[*]class C:
[*] @classmethod
[*] def meth(cls):
[*] ...
上面的 @classmethod 等于 meth=classmethod(meth)
decorator 能够用于为函数(普通函数或类的成员函数)添加功能, 不能够用来为类动态添加方法.
decorator 把被修饰的函数作为参数, 其返回值通常是一个函数或者类
技术上讲, 任何只带一个参数能够被调用的对象都可以被当作decorator使用, 但是这个定义过于宽泛而无用, 所以可以把decorator分为以下两类:
[*]signature-preserving decorator:例如, 一个输入为一个函数输出与该函数的输出一致的可调用对象
[*]signature-changing decorator: 例如, 内部类 staticmethod 和 classmethod 就属于这种类型, 因为它们会把被修饰的函数作为输入, 返回一个描述对象, 这个对象不是函数, 不可调用
Decorator的用法:
[*]@catch_on((exception list),functor)
其定义如下:
python 代码
[*]from types import *
[*]
[*]def catch_on(excepts, act):
[*] def call(proc, *args, **kw):
[*] try:
[*] return proc(*args, **kw)
[*] except excepts, e:
[*] if not act and type(act) is types.FunctionType:
[*] act(e)
[*] pass
[*] except Exception, e:
[*] if not isinstance(e, excepts):
[*] raise
[*]
[*] return decorator(call)
[*]
[*]def x():
[*] raise NameError, "NameError"
[*]
[*]def boo():
[*] raise KeyError, "KeyError"
[*]
[*]def bar():
[*] raise ValueError, "ValueError"
[*]
[*]@catch_on((KeyError, ValueError), lambda e: None)
[*]def koo():
[*] x()
[*] boo()
[*] bar()
[*]
[*]@catch_on((KeyError, ValueError), lambda e: None)
[*]def goo():
[*] boo()
[*] bar()
[*] x()
[*]
[*]koo()
[*]goo()
[*]代码块
页:
[1]