在Python中,有哪些例子可以说明decorator极大地简化了一个任务?

2024-04-29 01:54:21 发布

您现在位置:Python中文网/ 问答频道 /正文

试着找出装饰师什么时候真的有用,什么时候不那么有用的例子。 欢迎使用示例代码。在


Tags: 代码示例例子装饰师
3条回答

通常的例子是使用@property修饰符来创建只读属性:

@property
def count(self):
    return self._events

而不是:

^{pr2}$

要理解装饰器的有用性,最简单的方法就是看一些例子。举个例子来说:

你想学习一些代码 了解函数的调用时间和方式。 可以使用修饰符来更改函数 因此每次调用函数时,它都会打印一些调试信息:

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)

印刷品:

^{pr2}$

如果您只想跟踪一个函数foo,当然可以 将代码更简单地添加到foo的定义中:

def foo(*args):
    print('foo({0})'.format(args))

但是如果你有很多你想追踪的函数,或者 不想搞乱原来的代码,那就装潢吧 变得有用。在

有关有用的装饰器的其他示例,请参见the decorator library。在

decorator是用于调用高阶函数的特定方法的简单语法,因此如果只关注语法,则不太可能产生显著的差异。听着,不管你说什么

@mydecorator
def f(...):
  # body of f

你可以这样说

^{pr2}$

decorator语法的优势在于它更加简洁(不重复f三次;-),并且它出现在前的def(或者{},对于类装饰器)语句,因此可以立即提醒读者代码。这很重要,但不可能是伟大的!在

decorator的语义(与此模式匹配的高阶函数调用的语义相同,如果没有decorator;-)。例如

@classmethod
def f(cls, ...):

允许您生成类方法(特别是对于备用构造函数非常有用),以及

@property
def foo(self, ...):

允许您创建只读属性(对于非只读属性,使用2.6中的其他相关装饰器;-),即使在使用时,这些属性也非常有用(因为它们可以让您避免为本质上的属性编写大量愚蠢的“样板”访问器。。。只是因为将来访问属性可能需要触发一些计算!-). 在

除了内置在Python中的装饰器之外,您自己的装饰器也同样重要——当然,这取决于您的应用程序是什么。一般来说,它们可以很容易地将代码的某些部分(否则必须在许多函数和类中复制[[或者您可能不得不为类的情况求助于元类,但是那些更丰富、更复杂的正确使用]])重构到decorator中。因此,它们可以帮助您避免重复的样板代码,而且由于DRY“不要重复自己”是软件开发的一个核心原则,因此您能够得到的任何帮助都应受到衷心欢迎。在

相关问题 更多 >