Python 通过装饰器注入类属性
我有一大堆Django测试用例,它们使用setUp方法来初始化在许多测试中使用的一些属性,它们的构造和相互依赖的方式是我想要从测试用例中移出并重用的逻辑Python 通过装饰器注入类属性,python,django,pycharm,decorator,testcase,Python,Django,Pycharm,Decorator,Testcase,我有一大堆Django测试用例,它们使用setUp方法来初始化在许多测试中使用的一些属性,它们的构造和相互依赖的方式是我想要从测试用例中移出并重用的逻辑 def setUp(self): self.property_1 = ##some logic ... 我想把它们重写为一些方便的包装器,可以用一个简单的继承或装饰器注入类中,例如 @with_property_1(x=1, y=2) def setUp(self): ... def with_property_1
def setUp(self):
self.property_1 = ##some logic
...
我想把它们重写为一些方便的包装器,可以用一个简单的继承或装饰器注入类中,例如
@with_property_1(x=1, y=2)
def setUp(self):
...
def with_property_1(**model_kwargs):
def wrapper(f):
def wrapped(*args, **kwargs):
self = args[0]
self.property_1 = ## logic
f(*args, **kwargs)
return wrapped
return wrapper
但问题是PyCharm没有认识到这些实例属性的存在,因为TestCase类中没有设置它们。有没有其他方法可以很好地实现这一点,或者有没有一种方法可以诱使PyCharm认识到,考虑到装饰师的存在,这些属性是合法的?免责声明:这是未经测试的
这里的问题是Python不能将self
神奇地放到decorator中的上下文中(这在任何IDE中都不起作用)。您可能忘记的是,self
是调用每个类方法时传递给它的参数之一。因此,它存在于您的*args
中,您可以对其进行操作
这是我的试用码:
def with_property_1(**model_kwargs):
def wrapper(f):
def wrapped(*args, **kwargs):
for key, value in model_kwargs.items():
setattr(args[0], key, value)
f(*args, **kwargs)
return wrapped
return wrapper
说明:
**模型中的每个键/值
setattr
修改args[0]
,它应该是self
变量,并使用提供的KWARGself
变量正常调用函数self
神奇地放到decorator中的上下文中(这在任何IDE中都不起作用)。您可能忘记的是,self
是调用每个类方法时传递给它的参数之一。因此,它存在于您的*args
中,您可以对其进行操作
这是我的试用码:
def with_property_1(**model_kwargs):
def wrapper(f):
def wrapped(*args, **kwargs):
for key, value in model_kwargs.items():
setattr(args[0], key, value)
f(*args, **kwargs)
return wrapped
return wrapper
说明:
**模型中的每个键/值
setattr
修改args[0]
,它应该是self
变量,并使用提供的KWARGself
变量正常调用函数在这种情况下,最好使用第三方,如@ruddra,这似乎是完全的过度使用。在这种情况下,最好使用第三方,如@ruddra,这似乎是完全的过度使用。对不起,我在代码中漏掉了这一行。我已经在使用args[0]作为类的实例。这个问题与在类本身中使用
self.property_1
有关,PyCharm给出了一个编译警告,因为它无法看到在任何地方设置的属性。对不起,我在代码中漏掉了这一行。我已经在使用args[0]作为类的实例。问题更多地涉及在类本身中使用self.property_1
,其中PyCharm给出编译警告,因为它看不到在任何地方设置的属性