为什么super()无法实现__call__?

时间:2019-01-23 10:16:04

标签: python inheritance super

想象一下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__()

为什么第一个版本不起作用? 我找到了this related question,但没有回答这个问题。实际上,在评论那里的答案时也会问这个问题。

what super() actually returns的进一步阅读给我的印象是super()返回的代理将必须实现__call__并转发到正确的__call__实现。 从this answer中,我得到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

那为什么不这样做呢?

0 个答案:

没有答案