Возможно ли иметь декоратор класса Python с аргументами? - PullRequest
4 голосов
/ 24 ноября 2010

То, что я хотел бы сделать, это:

@add_cache(cache_this, cache_that, cache_this_and_that)
class MyDjangoModel(models.Model):
    blah

Но терпит неудачу, потому что кажется, что первый аргумент неявно является фактическим объектом класса.Можно ли обойти это или я вынужден использовать уродливый синтаксис в противоположность этому прекрасному синтаксису?

Ответы [ 2 ]

6 голосов
/ 24 ноября 2010

Ваше arg_cache определение должно сделать что-то вроде:

def arg_cache(cthis, cthat, cthisandthat):
   def f(obj):
       obj.cache_this = cthis
       obj.cache_that = cthat
       obj.thisandthat = cthisandthat
       return obj
   return f

@arg_cache(cache_this, cache_that, cache_this_and_that)
...

В примере предполагается, что вы просто хотите установить некоторые свойства для декорированного класса. Конечно, вы можете сделать что-то еще с тремя параметрами.

3 голосов
/ 24 ноября 2010

Напишите вызываемый объект, который возвращает соответствующий декоратор.

...