2015-05-26 4 views
1

Я следую ниже соглашениям, чтобы украсить определенные методы в классе Python. Мне интересно, есть ли другие способы сделать то же самое. Мой подход, конечно, выглядит не очень хорошо; вызов исходной функции-члена не выглядит интуитивно понятным вообще.Каков наилучший способ оформления методов класса 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

* Почему вы считаете, что ваш подход выглядит не очень хорошо? Если вы только когда-либо украшаете методы, почему бы просто не добавить 'self' к сигнатуре обертки? –

+1

@MartijnPieters вызов исходной функции-члена не выглядит интуитивно понятным вообще. Итак, я думаю, что будет лучший способ. –

+0

Это выглядит отлично, если вам нравится унарные операторы '*' и '**' Python. Некоторые конструкции просто выглядят странно, пока вы их не используете несколько раз – z0r

ответ

2

Если ваш декоратор может работать только по методам (потому что вам нужен доступ к экземпляру конкретного замка), то просто включить в обертку подписи self:

from functools import wraps 

def decobj(func): 
    @wraps(func) 
    def wrapper(self, *args, **kwards): 
     with self.lock: 
      print 'Got the lock' 
      func(self, *args, **kwards) 
    return wrapper 

я включал @functools.wraps() utility decorator; он будет копировать различные метаданные из исходной обернутой функции в оболочку. Это всегда хорошая идея.

Смежные вопросы