虽然我喜欢认为自己是一个相当称职的Python程序员,但我从来没有理解过这种语言的一个方面就是装饰器。
我知道它们是什么(表面上),我读过教程,例子,关于Stack Overflow的问题,我理解语法,可以自己写,偶尔使用@classmethod和@staticmethod,但我从来没有想过在自己的Python代码中使用装饰器来解决问题。我从来没有遇到过这样的问题:"Hmm...this看起来像是一个装饰师的工作!“
所以,我想知道你们是否可以提供一些例子,说明你们在自己的程序中使用装饰器的地方,希望我会有一个“啊哈!”一瞬间,并得到他们。
发布于 2009-01-29 01:54:12
我使用装饰器主要是为了计时。
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):
...
发布于 2009-01-29 00:55:21
我已经将它们用于同步。
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
)对象结合使用,以将装饰器的实现简化为:
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
无论如何,您都可以这样使用它:
import threading
lock = threading.Lock()
@synchronized(lock)
def do_something():
# etc
@synchronzied(lock)
def do_something_else():
# etc
基本上,它只是将lock.acquire()
/ lock.release()
放在函数调用的两端。
发布于 2009-01-28 23:49:31
我对类型检查参数使用装饰器,这些参数通过一些RMI传递给我的Python方法。因此,不是重复相同的参数计数,而是一次又一次地引发异常。
例如,而不是:
def myMethod(ID, name):
if not (myIsType(ID, 'uint') and myIsType(name, 'utf8string')):
raise BlaBlaException() ...
我只想声明:
@accepts(uint, utf8string)
def myMethod(ID, name):
...
而accepts()
为我做了所有的工作。
https://stackoverflow.com/questions/489720
复制相似问题