Python装饰器有哪些常见用途?

虽然我喜欢把自己看作是一个合理的Python编码器,但我从来没有能够理解的语言的一个方面是装饰器。

我知道他们是什么(表面上),我已经阅读了关于Stack Overflow的教程,示例,问题,并且我理解语法,可以编写自己的,偶尔使用@classmethod和@staticmethod,但是我从来没有想过使用装饰者来解决我自己的Python代码中的问题。 我从来没遇到过这样的问题:“呃......这看起来像是一个装饰工的工作!”

所以,我想知道你们是否可以提供一些你在自己的程序中使用过装饰器的例子,并且希望我会有一个“A-ha!”。 一瞬间,并得到它们。


我使用装饰器主要用于计时目的

def time_dec(func):

  def wrapper(*arg):
      t = time.clock()
      res = func(*arg)
      print func.func_name, time.clock()-t
      return res

  return wrapper


@time_dec
def myFunction(n):
    ...

我用它们进行了同步。

def synchronized(lock):
    """ Synchronization decorator """
    def wrap(f):
        def newFunction(*args, **kw):
            lock.acquire()
            try:
                return f(*args, **kw)
            finally:
                lock.release()
        return newFunction
    return wrap

正如在注释中指出的那样,由于Python 2.5可以将with语句与threading.Lock (或2.6版以后的multiprocessing.Lock )对象结合使用,以简化装饰器的实现,只需:

def synchronized(lock):
    """ Synchronization decorator """
    def wrap(f):
        def newFunction(*args, **kw):
            with lock:
                return f(*args, **kw)
        return newFunction
    return wrap

无论如何,你可以像这样使用它:

import threading
lock = threading.Lock()

@synchronized(lock)
def do_something():
  # etc

@synchronzied(lock)
def do_something_else():
  # etc

基本上它只是在函数调用的任一侧放置lock.acquire() / lock.release()


我使用装饰器来检查通过一些RMI传递给我的Python方法的参数。 所以不是重复相同的参数计数,而是一次又一次地例外提升mumbo-jumbo

def myMethod(ID, name):
    if not (myIsType(ID, 'uint') and myIsType(name, 'utf8string')):
        raise BlaBlaException() ...

我只是申报

@accepts(uint, utf8string)
def myMethod(ID, name):
    ...

并接受()为我做所有的工作。

链接地址: http://www.djcxy.com/p/54777.html

上一篇: What are some common uses for Python decorators?

下一篇: Calling functions with argparse