我正在一个可以接受变量的类中使用装饰器,我想在类中初始化该变量。
下面是我正在使用的一个示例(目前正在使用)。
_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):
...
您当前的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