我在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")
答案 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
参数,并且如果传入不是装饰器工厂的装饰器或不期望此参数的函数,则会发生异常。