想象一下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
那为什么不这样做呢?