装饰Python类的方法的最佳方法是什么?

时间:2015-05-26 13:12:01

标签: python methods decorator

我遵循以下约定来装饰Python类中的某些方法。我想知道是否有更好的方法来做同样的事情。我的做法当然不好看;对原始成员函数的调用看起来并不直观。

from threading import Lock

def decobj(fun):
    def fun2(*args, **kwards):
        with args[0].lock:
            print 'Got the lock'
            fun(*args, **kwards)
    return fun2

class A:
    def __init__(self, a):
        self.lock = Lock()
        self.x = a
        pass

    @decobj
    def fun(self, x, y):
        print self.x, x, y


a = A(100)
a.fun(1,2)

1 个答案:

答案 0 :(得分:2)

如果您的装饰器只能处理方法(因为您需要访问特定于实例的锁),那么只需在包装器签名中包含${__javaScript(${startId}<=${endId},)}

self

我加入了@functools.wraps() utility decorator;它将从原始包装函数的各种元数据复制到包装器。这总是一个好主意。