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()
- 代码块
本文深入探讨了Python中装饰器的概念及应用,包括装饰器的基本语法、如何为函数添加额外的功能而不修改原始函数代码,以及一些具体的例子。文章还介绍了装饰器的分类,如保留签名的装饰器和改变签名的装饰器,并提供了错误处理装饰器的具体实现。
309

被折叠的 条评论
为什么被折叠?



