Почему super () не реализует __call__? - PullRequest
0 голосов
/ 23 января 2019

Представьте себе следующую ситуацию в Python 3 (я использую 3.6):

class T(object):
    def __call__(self):
        return 5

class U(T):
    def __call__(self):
        return 10 + super()()

U()()

Это приводит к TypeError: 'super' object is not callable.

Чтобы все заработало, необходимо определить Uследующим образом:

class U(T):
    def __call__(self):
        return 10 + super().__call__()

Почему не работает первая версия?Я нашел этот связанный вопрос , но он не отвечает на этот вопрос.На самом деле, этот вопрос также задается в комментарии к ответу там.

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

Если я правильно понимаю,это означает, что для того, чтобы super()() работал, прокси-сервер должен был реализовать только следующее:

def __call__(self, *args, **kwargs):
    try:
        return self["__call__"](*args, **kwargs)  # not sure if self is already bound to the method, if not that needs to be handled
    except AttributeError as ae:
        raise TypeError("Super is not callable") from ae

Так почему же он этого не делает?

...