Python装饰程序无法访问被调用的方法

2024-04-19 00:15:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为一个方法编写一个decorator,该方法将调用第二个方法。运行代码时收到错误:
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)

如何将第二个方法传递给第一个方法,使装饰者能够识别它?你知道吗

任何帮助都是惊人的!你知道吗


Tags: 方法代码selfreturnfooinitformatterdef
1条回答
网友
1楼 · 发布于 2024-04-19 00:15:02

将方法传递给Backoff,将其作为实例变量赋值,然后调用它。在Backoff.__call__中调用它之前,它不会绑定到实例,然后它会绑定到Backoff的实例,而该实例没有formatter属性。你知道吗

根据您的实例方法需要访问什么,可能有一个简单的解决方案(即,如果它只需要引用一个类或静态方法,它可以直接调用完全限定名)。但是,如果您需要instance方法来引用实例属性,我建议您不要使用类装饰器。使用函数装饰器不会遇到这些问题,您可以创建一个闭包并返回具有相同调用签名的函数。你知道吗

相关问题 更多 >