在类

时间:2017-12-20 23:53:29

标签: python python-decorators

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

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

_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):
     ...

1 个答案:

答案 0 :(得分: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