import functools
def trace(f):
'''This decorator shows how the function was called'''
@functools.wraps(f)
def wrapper(*arg,**kw):
arg_str=','.join(['%r'%a for a in arg]+['%s=%s'%(key,kw[key]) for key in kw])
print "%s(%s)" % (f.__name__, arg_str)
return f(*arg, **kw)
return wrapper
@trace
def foo(*args):
pass
for n in range(3):
foo(n)
通常的例子是使用
@property
修饰符来创建只读属性:而不是:
^{pr2}$要理解装饰器的有用性,最简单的方法就是看一些例子。举个例子来说:
你想学习一些代码 了解函数的调用时间和方式。 可以使用修饰符来更改函数 因此每次调用函数时,它都会打印一些调试信息:
印刷品:
^{pr2}$如果您只想跟踪一个函数
foo
,当然可以 将代码更简单地添加到foo
的定义中:但是如果你有很多你想追踪的函数,或者 不想搞乱原来的代码,那就装潢吧 变得有用。在
有关有用的装饰器的其他示例,请参见the decorator library。在
decorator是用于调用高阶函数的特定方法的简单语法,因此如果只关注语法,则不太可能产生显著的差异。听着,不管你说什么
你可以这样说
^{pr2}$decorator语法的优势在于它更加简洁(不重复},对于类装饰器)语句,因此可以立即提醒读者代码。这很重要,但不可能是伟大的!在
f
三次;-),并且它出现在前的def
(或者{decorator的语义(与此模式匹配的高阶函数调用的语义相同,如果没有decorator;-)。例如
允许您生成类方法(特别是对于备用构造函数非常有用),以及
允许您创建只读属性(对于非只读属性,使用2.6中的其他相关装饰器;-),即使在使用不时,这些属性也非常有用(因为它们可以让您避免为本质上的属性编写大量愚蠢的“样板”访问器。。。只是因为将来访问属性可能需要触发一些计算!-). 在
除了内置在Python中的装饰器之外,您自己的装饰器也同样重要——当然,这取决于您的应用程序是什么。一般来说,它们可以很容易地将代码的某些部分(否则必须在许多函数和类中复制[[或者您可能不得不为类的情况求助于元类,但是那些更丰富、更复杂的正确使用]])重构到decorator中。因此,它们可以帮助您避免重复的样板代码,而且由于DRY“不要重复自己”是软件开发的一个核心原则,因此您能够得到的任何帮助都应受到衷心欢迎。在
相关问题 更多 >
编程相关推荐