首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python装饰器的一些常见用法是什么?

Python装饰器的一些常见用法是什么?
EN

Stack Overflow用户
提问于 2009-01-28 22:35:03
回答 13查看 78.7K关注 0票数 357

虽然我喜欢认为自己是一个相当称职的Python程序员,但我从来没有理解过这种语言的一个方面就是装饰器。

我知道它们是什么(表面上),我读过教程,例子,关于Stack Overflow的问题,我理解语法,可以自己写,偶尔使用@classmethod和@staticmethod,但我从来没有想过在自己的Python代码中使用装饰器来解决问题。我从来没有遇到过这样的问题:"Hmm...this看起来像是一个装饰师的工作!“

所以,我想知道你们是否可以提供一些例子,说明你们在自己的程序中使用装饰器的地方,希望我会有一个“啊哈!”一瞬间,并得到他们。

EN

回答 13

Stack Overflow用户

发布于 2009-01-29 01:54:12

我使用装饰器主要是为了计时。

代码语言:javascript
复制
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):
    ...
票数 133
EN

Stack Overflow用户

发布于 2009-01-29 00:55:21

我已经将它们用于同步。

代码语言:javascript
复制
import functools

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

正如评论中所指出的,从Python2.5开始,您可以将with语句与threading.Lock (或从2.6版开始的multiprocessing.Lock )对象结合使用,以将装饰器的实现简化为:

代码语言:javascript
复制
import functools

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

无论如何,您都可以这样使用它:

代码语言:javascript
复制
import threading
lock = threading.Lock()

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

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

基本上,它只是将lock.acquire() / lock.release()放在函数调用的两端。

票数 103
EN

Stack Overflow用户

发布于 2009-01-28 23:49:31

我对类型检查参数使用装饰器,这些参数通过一些RMI传递给我的Python方法。因此,不是重复相同的参数计数,而是一次又一次地引发异常。

例如,而不是:

代码语言:javascript
复制
def myMethod(ID, name):
    if not (myIsType(ID, 'uint') and myIsType(name, 'utf8string')):
        raise BlaBlaException() ...

我只想声明:

代码语言:javascript
复制
@accepts(uint, utf8string)
def myMethod(ID, name):
    ...

accepts()为我做了所有的工作。

票数 76
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/489720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档