代码之家  ›  专栏  ›  技术社区  ›  guidoism

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

  •  4
  • guidoism  · 技术社区  · 14 年前

    我想做的是:

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

    但失败,因为第一个参数似乎隐式地是实际的类对象。有没有可能绕过这个问题,或者我被迫使用丑陋的语法而不是美丽的语法?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Edmund    14 年前

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

    本例假设您只想在修饰类上设置一些属性。你当然可以用这三个参数做些别的事情。

        2
  •  3
  •   Ignacio Vazquez-Abrams    14 年前

    写一个可调用的,返回一个合适的装饰器。