Python装饰器无法访问被调用的方法
Python Decorator cannot access called method
我正在尝试为将调用第二个方法的方法编写装饰器。当我 运行 我收到错误代码时:
AttributeError: 'Backoff' object has no attribute 'formatter'
简化后的代码是:
class Backoff:
def __init__(self, f):
self.f = f
def __call__(self, *args, **kwargs):
n = 1
while n < 11:
try:
return self.f(self, *args, **kwargs)
except FooError as e:
<handle error>
time.sleep((2 ** n) + (random.randint(0, 1000) / 1000))
n = n + 1
class SomeClass:
def __init__(self):
pass
@Backoff
def first_method(self, foo, bar):
return self.formatter(foo, bar)
def formatter(self, x, y):
return some_function_to_format(x, y)
如何以装饰器可以识别的方式将第二个方法传递给第一个方法?
任何帮助都会很棒!
您正在将一个方法传递给 Backoff
,将其指定为实例变量,然后调用它。在 Backoff.__call__
中调用它之前,它不会绑定到实例,然后它会绑定到 Backoff
的实例,该实例没有 formatter
属性.
根据您的实例方法需要访问的内容,可能有一个直接的解决方案(即如果它只需要引用 class 或静态方法,它可以直接调用完全限定名称) .但是,如果您需要实例方法来引用实例 属性,我建议根本不要使用 class 装饰器。使用函数装饰器不会运行陷入这些问题,你可以创建一个闭包和return一个具有相同调用签名的函数。
我正在尝试为将调用第二个方法的方法编写装饰器。当我 运行 我收到错误代码时:
AttributeError: 'Backoff' object has no attribute 'formatter'
简化后的代码是:
class Backoff:
def __init__(self, f):
self.f = f
def __call__(self, *args, **kwargs):
n = 1
while n < 11:
try:
return self.f(self, *args, **kwargs)
except FooError as e:
<handle error>
time.sleep((2 ** n) + (random.randint(0, 1000) / 1000))
n = n + 1
class SomeClass:
def __init__(self):
pass
@Backoff
def first_method(self, foo, bar):
return self.formatter(foo, bar)
def formatter(self, x, y):
return some_function_to_format(x, y)
如何以装饰器可以识别的方式将第二个方法传递给第一个方法?
任何帮助都会很棒!
您正在将一个方法传递给 Backoff
,将其指定为实例变量,然后调用它。在 Backoff.__call__
中调用它之前,它不会绑定到实例,然后它会绑定到 Backoff
的实例,该实例没有 formatter
属性.
根据您的实例方法需要访问的内容,可能有一个直接的解决方案(即如果它只需要引用 class 或静态方法,它可以直接调用完全限定名称) .但是,如果您需要实例方法来引用实例 属性,我建议根本不要使用 class 装饰器。使用函数装饰器不会运行陷入这些问题,你可以创建一个闭包和return一个具有相同调用签名的函数。