我有一个实例化一堆类的类。我不希望每个这些类都被修饰(用于测试目的),所以我用包装器将它们包装到主类中,然后包装它们的所有方法。当我创建该类的多个实例时,它的函数已经被包装,因为我使用了无关的对象来准备它。是否有避免每次重新包装它们的好方法?装饰所有类的方法而不用每次都重新装饰
简化的例子:
UserResource.py:
class UserResource(object):
def test(self):
pass
resource.py:
def resource_wrapper(resource_class):
def decorate(cls):
for attr in cls.__dict__:
if callable(getattr(cls, attr)) and not attr.startswith('_'):
setattr(cls, attr, _function_wrapper(getattr(cls, attr)))
return cls
return decorate(resource_class)
def _function_wrapper(fn):
from functools import wraps
@wraps(fn)
def wrapper(*args, **kwargs):
self = args[0]
arg = kwargs.pop('test', False)
print arg # See output further down
return fn(*args, **kwargs)
return wrapper
TL;博士一束非实例的类,包有一个包装所有功能的包装器。每次运行时都会封装函数。
当我运行此我看到以下行为:
r1 = resource_wrapper(UserResource)()
r1.test(test=True)
# True
r2 = resource_wrapper(UserResource)()
r2.test(test=True)
# True
# False
r3 = resource_wrapper(UserResource)()
r3.test(test=True)
# True
# False
# False
有没有办法只能换每次的功能,而不是一次的?
听起来像你需要一个类工厂。不要在原地修改'UserResource',你应该编写一个返回包含包装方法的新类的函数。 –
“为测试目的”是什么意思?我可能总是把它们包起来,并且把我的测试包装掉? –
啊,是的,但不仅仅是为了测试的目的,我也希望这个类具有正常的行为,并且如果以这种特殊的方式使用了其他样板魔法的话。这很难解释,但请记住,上面的代码是一个非常简单的例子。 – olofom