function decorator:
语法:
@decoratorname
def decoratoredfunction
例如:
上面的 @classmethod 等于 meth=classmethod(meth)
decorator 能够用于为函数(普通函数或类的成员函数)添加功能, 不能够用来为类动态添加方法.
decorator 把被修饰的函数作为参数, 其返回值通常是一个函数或者类
技术上讲, 任何只带一个参数能够被调用的对象都可以被当作decorator使用, 但是这个定义过于宽泛而无用, 所以可以把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 就属于这种类型, 因为它们会把被修饰的函数作为输入, 返回一个描述对象, 这个对象不是函数, 不可调用
- @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()
- 代码块