是否可以使用带参数的Python类装饰器?

时间:2010-11-24 02:07:25

标签: python decorator

我想做的是:

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

但是失败了,因为看起来第一个参数隐含地是实际的类对象。有可能解决这个问题,还是我被迫使用丑陋的语法而不是这种美妙的语法?

2 个答案:

答案 0 :(得分:6)

您的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)
...

该示例假设您只想在装饰类上设置一些属性。当然,您可以使用这三个参数执行其他操作。

答案 1 :(得分:3)

编写一个返回适当装饰器的callable。