Python Decorator не может получить доступ к вызываемому методу - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь написать декоратор для метода, который вызовет второй метод.Когда я запускаю код, я получаю сообщение об ошибке:
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)

Как передать второй метод в первый метод вспособ, которым декоратор может распознать это?

Любая помощь будет удивительной!

1 Ответ

0 голосов
/ 08 июня 2018

Вы передаете метод в Backoff, назначаете его как переменную экземпляра и затем вызываете его.Он не привязан к экземпляру, пока он не будет вызван в Backoff.__call__, где он затем привязан к экземпляру Backoff, у которого нет свойства formatter.

Возможно, существует простое решениеэто зависит от того, к какому методу вашего экземпляра требуется доступ (т. е. если ему нужно только сослаться на класс или статический метод, он может просто вызвать полностью определенное имя напрямую).Однако, если вам нужен метод экземпляра для ссылки на свойство экземпляра, я бы предложил вообще не использовать декоратор класса.Использование функции декоратора не столкнется с этими проблемами, вы можете создать замыкание и вернуть функцию с той же сигнатурой вызова.

...