Представьте себе следующую ситуацию в 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
Так почему же он этого не делает?