Python 通过装饰器注入类属性

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

我有一大堆Django测试用例,它们使用setUp方法来初始化在许多测试中使用的一些属性,它们的构造和相互依赖的方式是我想要从测试用例中移出并重用的逻辑

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
    变量,并使用提供的KWARG

  • 使用更新的
    self
    变量正常调用函数

  • 免责声明:这是未经测试的

    这里的问题是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
    变量,并使用提供的KWARG

  • 使用更新的
    self
    变量正常调用函数


  • 在这种情况下,最好使用第三方,如@ruddra,这似乎是完全的过度使用。在这种情况下,最好使用第三方,如@ruddra,这似乎是完全的过度使用。对不起,我在代码中漏掉了这一行。我已经在使用args[0]作为类的实例。这个问题与在类本身中使用
    self.property_1
    有关,PyCharm给出了一个编译警告,因为它无法看到在任何地方设置的属性。对不起,我在代码中漏掉了这一行。我已经在使用args[0]作为类的实例。问题更多地涉及在类本身中使用
    self.property_1
    ,其中PyCharm给出编译警告,因为它看不到在任何地方设置的属性