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
作为装饰器呢?为什么不将重试功能构建到适当的方法中呢?我希望它不会是这样的:)但这是有意义的。非常感谢你在这方面的帮助,布雷特!