为什么继承'object'的python类在__init__方法中调用'super'?

Chr*_*her 6 python inheritance super python-requests

我在requests模块的源头四处寻找,并注意到这段代码:

class Response(object):
    """The :class:`Response <Response>` object, which contains a
    server's response to an HTTP request.
    """

    def __init__(self):
        super(Response, self).__init__()
        ... more init method...
Run Code Online (Sandbox Code Playgroud)

我的理解super()表明这个电话根本不会做任何事情.我发现相当的几个问题,关于超通话,但其他类的子类,但并非所有的工作object本身.在python文档,也没有提及这种结构.

在我看来,这可能只是一个错误,如果您git blame将该文件提交给引入该行提交,您将看到在作者身份时,它Response是一个子类BaseResponse.该行只是一个类重构的延续,还是这个super()调用做了什么呢?

Luk*_*asa 2

正如科利·布里格曼的评论中提到的中提到的,这是不必要的,但无害。

对于一些背景知识,该类BaseResponse是在 Kenneth 的 Requests 1.0 冲刺期间添加的。1.0 代码更改引入了传输适配器,这使得可以为某些 HTTP 端点(或者实际上是非 HTTP 端点)定义特定行为。Transport Adapter 接口的一个重要部分是该HTTPAdapter.build_response()方法,它获取返回的原始响应HTTPAdapter.send()并构建一个 RequestsResponse并从中

很明显,Kenneth 看到了为 s 提供某种形式的抽象基类的潜在实用性,这将允许传输适配器以与标准 HTTP 非常不同的行为Response返回sResponseResponse对象。出于这个原因,将大部分逻辑重构为 ABC 并在子类中似乎是有意义的。

后来在重构中,由于不必要的复杂性,这一点再次被取消。现实情况是,想要定义专门Response对象的人们可以简单地子类化Response,而不是拥有一个什么也不做的 ABC 。这使得代码中的主线用例(普通请求)更加清晰,并且几乎没有实用性。

BaseRequest类被删除时,这条线被忽略了,但由于它不会引起任何问题,所以从来不需要删除它。