社区首页 >问答首页 >使用超级vs静态调用基类的Python

使用超级vs静态调用基类的Python
EN

Stack Overflow用户
提问于 2016-03-08 13:00:36
回答 2查看 1K关注 0票数 1

我到处看,每个人都在说超级()有多棒。但是,我倾向于不使用super(),因为它使一切都比我想要的要复杂得多。我见过一些使用super()的流行示例,但它们似乎从未显示将位置所需的参数传递到基类构造函数中。

我知道Python中的菱形问题,而super()阻止了两次调用base_base类。(在本个案中属A类)

A类的构造函数会被调用两次吗?(即案件2)

下面是我对这两种情况的代码。

案例1:使用._ init _()

代码语言:javascript
代码运行次数:0
复制
#abstractclass
class A(object):

    #abstractmethod
    def __init__(self, for_a, *args):
        self.val_a = for_a

#abstractclass
class B(A):

    #abstractmethod
    def __init__(self, for_a, for_b, for_c):
        super().__init__(for_a, for_c)
        self.val_b = for_b

#abstractclass
class C(A):

    #abstractmethod
    def __init__(self, for_a, for_c):
        super().__init__(for_a)
        self.val_c = for_c

class D(B, C):

    def __init__(self, for_a, for_b, for_c, for_d):
        super().__init__(for_a, for_b, for_c)
        self.val_d = for_d

class E(B):

    def __init__(self, for_a, for_b, for_e, *args):
        super().__init__(for_a, for_b, *args)
        self.val_e = for_e

newobject1 = D(1, 2, 3, 4)

newobject2 = E(10, 11, 12, 0)

案例2:静态-使用base._ init _(self)

代码语言:javascript
代码运行次数:0
复制
#abstractclass
class A(object):

    #abstractmethod
    def __init__(self, for_a):
        self.val_a = for_a

#abstractclass
class B(A):

    #abstractmethod
    def __init__(self, for_a, for_b):
        A.__init__(self, for_a)
        self.val_b = for_b

#abstractclass
class C(A):

    #abstractmethod
    def __init__(self, for_a, for_c):
        A.__init__(self, for_a)
        self.val_c = for_c

class D(B, C):

    def __init__(self, for_a, for_b, for_c, for_d):
        B.__init__(self, for_a, for_b)
        C.__init__(self, for_a, for_c)
        self.val_d = for_d

class E(B):

    def __init__(self, for_a, for_b, for_e):
        super().__init__(for_a, for_b)
        self.val_e = for_e

newobject1 = D(1, 2, 3, 4)

newobject2 = E(10, 11, 12)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-08 13:07:37

A类的构造函数会被调用两次吗?

当然,如果构造函数是缓慢的,或者是非幂等的,或者如果它获得资源,如文件句柄或数据库连接。在更复杂的继承结构中,您还可能会得到调用4次或6次的构造函数,或者从子继承图到祖先的继承图上的路径数。

我倾向于不使用超级(),因为它使一切比我想要的要复杂得多

这不是让事情变得复杂的super --而是多重继承。在多重继承中避免super只会给您带来不同的、可能比super的问题更糟糕的问题。

我见过一些使用super()的流行示例,但它们似乎从未显示将位置所需的参数传递到基类构造函数中。

这是因为位置构造函数参数在多重继承中不能很好地工作。如果您想要使用这样的多继承结构,请尝试只使用参数关键字,并使用**kwargs传递其他类要处理的不可识别的参数。“Python的超级()被认为是超级”对如何使其工作有一些很好的建议。

票数 1
EN

Stack Overflow用户

发布于 2016-03-08 13:15:53

super()的思想是支持方法分解顺序,这样您就可以使用合作继承编写程序。

如果您想调用超类的方法,合作继承是有意义的,但是您不知道具体的超类是什么--您只有一个假设,即该方法具有与您正在编写的方法相同的签名。

在您的示例中,每个__init__都是不同的,因此对于协作继承来说,这不是一个好的用例。每个类实际上都需要知道super的目标是什么,以便正确地调用它。因此,在这里您并没有从super中得到太多的好处。

让我们不要忘记:多重继承会导致混乱。为了让您的代码可以理解,并控制意大利面,您可以遵守一些约定(一系列限制)。一种方法是使用一些基类作为混合器。另一个想法是合作继承。Python有像super这样的语言构造来支持这些,但是如果您可以自由地走出这些边界。这与它自己的一系列问题有关。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35877911

复制
相关文章
Ngnix如何处理http请求
nginx首先确定哪个服务器应处理该请求。让我们从一个简单的配置开始,其中所有三个虚拟服务器都在端口*:80上侦听:
星哥玩云
2022/08/08
9470
测试中如何处理 Http 请求?
不知道大家平时写单测时是怎么处理 网络请求 的,可能有的人会说:“把请求函数 Mock ,返回 Mock 结果就行了呀”。
写代码的海怪
2022/08/31
1.3K0
[CodeIgniter4]概述-处理 HTTP 请求
为了充分地使用 CodeIgniter,你需要对 HTTP 请求和响应的工作方式有基本的了解。对于所有想要成功的开发者来说, 理解 HTTP 背后的概念是 必须 的。
landv
2020/03/05
1.9K0
Http请求处理流程
我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net。他们耐心、细致地告诉你如何一步步拖放控件、设置控件属性、编写CodeBehind代码,以实现某个特定的功能。
张子阳
2018/09/27
1.3K0
Http请求处理流程
如何使用Java处理HTTP请求和响应?
Java中有许多成熟的HTTP框架可以使用,例如Spring、Netty等。这些框架提供了各种HTTP处理器和工具类,使得HTTP请求和响应处理变得更加容易和高效。下面是一个简单的Java代码示例,演示如何使用Java处理HTTP请求和响应:
用户1289394
2023/08/22
6540
如何使用Java处理HTTP请求和响应?
图解 Spring:HTTP 请求的处理流程与机制【1】
2003 年,老兵哥初到中兴开始研究生实习,Spring 就是那年诞生的,2004 年 3 月发布了 1.0 版本,到现在已经超过 15 年了。从单体式分层架构到云原生微服务架构,它稳坐在 JAVA 应用框架的头把交椅上从未被撼动,它给我们带来了巨大的价值,不仅可以降低开发难度,同时还可以提升开发效率。但时间这把杀猪刀不仅改变了老兵哥,也同样没放过 Spring,我们都变得越来越强大了。
IT老兵哥
2020/01/15
1K0
图解 Spring:HTTP 请求的处理流程与机制【1】
RxJS 处理多个Http请求
有时候进入某个页面时,我们需要从多个 API 获取数据然后进行页面显示。管理多个异步数据请求会比较困难,但我们可以借助 Angular Http 服务和 RxJS 库提供的功能来实现上述的功能。处理多个请求有多种方式,使用串行或并行的方式。
阿宝哥
2019/11/05
5.8K0
NodeJS源码解析--Node如何处理HTTP请求
看过我之前的写的文章的朋友们应该会知道,使用NodeJS创建一个HTTP服务器是非常简单的。我们写的一个个API中使用req来接收请求,使用res来响应请求。那么req/res参数从何而来?http的头部信息是如何进行创建呢?接下来我们来从源码角度分析:NodeJS究竟是如何处理一个HTTP请求。
创译科技
2019/07/10
2.2K0
NodeJS源码解析--Node如何处理HTTP请求
HTTP请求与响应处理
客户端向服务器端发送请求时,有时需要携带一些客户信息,客户信息需要通过请求参数的形式传递到服务器端,比如登录操作。
Qwe7
2022/04/22
8690
HTTP请求与响应处理
客户端向服务器端发送请求时,有时需要携带一些客户信息, 客户信息需要通过请求参数的形式传递到服务器端,比如登录操作。
清出于兰
2020/10/29
9490
HTTP请求与响应处理
Influxdb的Http请求处理流程
3.4 关键函数之s.serverTCP(),使用之前初始化的listener和handler启动真正的http服务
扫帚的影子
2018/12/13
1.1K0
HTTP跨域请求后台处理
字面意思就是从Y域中去Http请求X域的后台,但是请求反馈的资源的Http头中没有包含'Access-Control-Allow-Origin'内容,什么意思呢?
Cloudox
2021/11/23
7850
【http 请求返回状态码 500 】 Spring Boot 模拟http请求「建议收藏」
最近弄的项目中要求给另外一个服务器传送数据,预定是用http的方式,在开始动手之前我打算用Spring Boot模拟下服务器之间的请求
全栈程序员站长
2022/08/31
3.3K0
【http 请求返回状态码 500 】 Spring Boot 模拟http请求「建议收藏」
面试官:tomcat是如何处理http请求的?
因为tomcat实现了Servlet规范,所以我们得掌握什么是Servlet?什么是Servlet规范? 什么是Servlet呢? Servlet是JavaEE规范的一种,主要是为了扩展Java作为W
田维常
2021/01/28
9000
Fiddler怎么抓取Net程序内部的Http请求包
(Fiddler是通过在本机计算器添加一个默认的代理服务器来实现的抓包数据的,端口号为:8888)
西柚dzh
2022/06/09
9260
Fiddler怎么抓取Net程序内部的Http请求包
python 3 处理HTTP 请求的包
http: https://docs.python.org/3/library/http.html
py3study
2020/01/03
1.2K0
Python处理HTTP请求之requests指北
如果你需要在Python中进行HTTP请求的处理,有很多种方式可以使用。比较原始的有Python的内置库urllib、也有比较高级一点的第三方模块aiohttp。
州的先生
2020/09/16
3.7K0
Python处理HTTP请求之requests指北
4 OpenResty & Lua 处理各类Http请求
测试有不同的结果,form-data数据是混乱的,x-www-form-urlencoded才是正常的!
收心
2022/08/24
1.9K0
4 OpenResty & Lua 处理各类Http请求
HTTP请求的11个处理阶段
摘自 陶辉 深入理解Nginx 几乎所以有关Nginx书只要是讲深入点的就会讲到Nginx请求的11个处理阶段,要记住这些真是不易,人脑特别不擅长记住各种东西,只能做些索引罢了,能做到知道这个知识点在哪儿能找到不就行了,可是你去面试还是问这些理论,所以这里汇总下记录如下 ngx_http_phases阶段定义 typedef enum { // 在接收到完整的HTTP头部后处理的HTTP阶段 NGX_HTTP_POST_READ_PHASE = 0, /*在将请求的URI与l
三杯水Plus
2019/03/14
5960
点击加载更多

相似问题

如何在Spring中处理HTTP选项请求?

31

用tomcat和spring异步处理http请求

12

Spring boot同时处理http和HTTPS请求

20

如何在Spring中分析复杂的http请求处理?

30

Spring Boot Web:停止当前http请求处理

1163
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文