在类中初始化Decorator变量

问题描述 投票:2回答:1

我正在一个可以接受变量的类中使用装饰器,我想在类中初始化该变量。

下面是我正在使用的一个示例(目前正在使用)。

_RETRIES = 3

class MyClass(object):
  def __init__(self, foo):
    self._foo=foo

  @retry.FuzzedIntervalsOnException(num_retries=_RETRIES)
  def my_method(self):
    return some_data

但是我想改变它以接受类似def __init__(self, foo, retries=3)的东西,以允许客户决定重试次数。但是实现这个是抛出一个未定义的变量错误。

我希望得到类似下面的内容,但似乎正确答案会比这更复杂:

class MyClass(object):
  def __init__(self, foo, retries=3):
    self._foo=foo
    self.retries=retries

  @retry.FuzzedIntervalsOnException(num_retries=self.retries)
  def my_method(self):
    return some_data

有没有一种理想的方法来初始化要在装饰器中使用的类变量?

提前谢谢了

编辑:有关重试的其他信息,下面是初始化。

class FuzzedIntervalsOnException(object):
   """Retry on exception 

   args:
     delay: Time delay in seconds for each retry.
     num_retries: Total number of retries.
   """
   def __init__(self, delay, num_retries):
     ...
python python-decorators
1个回答
1
投票

您当前的retry可能看起来像这样:

def retry(num_retries=0):
    def decorator(fn):
        def wrapper(*args, **kwargs):
            # ...
        return wrapper
    return decorator

你想获得self.retries,但在调用self之前你不会引用wrapper。因此,唯一的方法是在self.retries中获得wrapper。既然你没有将任何参数传递给装饰器,你也可以摆脱一个层并做这样的事情:

def retry(fn):
    def wrapper(self, *args, **kwargs):
        num_retries = self.retries
        # ...
    return wrapper
© www.soinside.com 2019 - 2024. All rights reserved.