Python 初始化类中的装饰变量

Python 初始化类中的装饰变量,python,python-decorators,Python,Python Decorators,我正在使用一个类中可以接受变量的装饰器,我想在类中初始化该变量 下面是我目前正在使用的示例(目前正在使用) 但是,我想将其更改为接受类似于def\uuuu init\uuuu(self,foo,retries=3)的内容,以允许客户端决定重试次数。然而,实现这一点会抛出一个未定义的变量错误 我希望得到下面这样的答案,但是正确的答案似乎比这更复杂: class MyClass(object): def __init__(self, foo, retries=3): self._foo=

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

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

但是,我想将其更改为接受类似于
def\uuuu init\uuuu(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):
     ...

您当前的
重试
可能如下所示:

def retry(num_retries=0):
    def decorator(fn):
        def wrapper(*args, **kwargs):
            # ...
        return wrapper
    return decorator
def retry(fn):
    def wrapper(self, *args, **kwargs):
        num_retries = self.retries
        # ...
    return wrapper
您希望获得
self.retries
,但在调用
wrapper
之前,您不会有对
self
的引用。因此,唯一的方法是在
包装器
中获取
self.retries
。因为您没有向装饰器传递任何参数,所以您也可以去掉一个层并执行如下操作:

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

您是否可以更改重试修饰符以从self获取
num\u retries
,而不是在外部调用中接受它?您不能在修饰符调用中引用
self.retries
,因为这发生在类定义时,但在实例化类之前没有
self
。但是您可以编写
retry
,这样当调用修饰函数时,如果没有给出
num\u retries
,它就会查看
self
。您能否(可能粗略地)演示一下
retry
本身的实现?现在你没有展示任何关于
retry
的实际工作原理。啊,这很有趣。是的,我想这正是我遇到的,这两个解决方案中的一个似乎会奏效。我现在将添加到我的问题中,以添加关于重试实现的附加信息……另外,请注意,如果您这样做,您的类和装饰器将以一种可能令人困惑的方式交织在一起。如果在实例化时需要指定重试次数,那么为什么需要
retry
作为装饰器呢?为什么不将重试功能构建到适当的方法中呢?我希望它不会是这样的:)但这是有意义的。非常感谢你在这方面的帮助,布雷特!