如何在Python中的类装饰器中传递args?

时间:2015-10-27 01:55:56

标签: python decorator

我在Python中使用此代码将装饰器应用于类的所有方法:

import inspect

def decallmethods(decorator, prefix='test_'):
  def dectheclass(cls):
    for name, m in inspect.getmembers(cls, inspect.ismethod):
      if name.startswith(prefix):
        setattr(cls, name, decorator(m))
    return cls
  return dectheclass


@decallmethods(login_testuser)
class TestCase(object):
    def setUp(self):
        pass

    def test_1(self):
        print "test_1()"

    def test_2(self):
        print "test_2()"

这很好用。但是,我想将一些kwargs传递给我想要应用的装饰器。

所以,我想要这样的东西:

@decallmethods(login_testuser, data="TEST") on class

它应用于方法的装饰器变为:

@login_testuser(data="TEST")

1 个答案:

答案 0 :(得分:1)

你构造它的方式意味着decorator的{​​{1}}参数变成了装饰工厂(构造函数),就像decallmethods返回类装饰器一样。如果你有这个,你只需要改变电话

decallmethods

setattr(cls, name, decorator(m))

用于静态实现。要使此动态,您还需要重新定义setattr(cls, name, decorator(data="TEST")(m)) 以接受decallmethods参数

data

(另外,回想一下the time当我向你指出装饰器只是一个函数,它接受一个函数来返回一个新函数,在你的情况下,调用是def decallmethods(decorator, prefix='test_', data='TEST'): ... setattr(cls, name, decorator(data=data)(m)) ,当它是这样,复制就是微不足道的。)

当然,这假设函数test_method = login_testuser(data="TEST")(test_method)将能够使用decorator参数,并且如果传入不是装饰器工厂的装饰器或不期望此参数的函数,则会发生异常。