类的继承中的super()

Python类继承及super()函数 文章目录Python中单类继承普通类方法继承初始化函数继承Python中多类继承 Python中单类继承 Python是一门面向对象的编程语言,支持类继承。新的类称为子类(Subclass),被继承的类称为父类、基类或者超类。子类继承父类后,就拥有父类的所有特性。类继承的简单例子: 普通类方法继承 class Fruit(): def color(self): print(... 阅读详情

在python中,关于类的继承有很多场景和知识点。今天聚焦在一个场景:有一个父类A,类中定义了某个问题中的通用属性和方法(即后面的子类都需要用到),在子类B中需要继承这些属性和方法,同时添加自己特有的属性和方法,应该如何实现?

在子类中,继承并初始化父类属性的方式有两种:

  1. 显示调用父类的初始化函数,并且对属性进行初始化;
  2. 通过super()初始化父类属性;

对于方式1,代码:

class A:
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def func(self):
        return self.a+self.b

class B(A):
    def __init__(self,x1,x2,x3,x4):
        A.__init__(self,a=x1,b=x2)#注意必须要传入self,相当于把B的实例传进去
        self.c=x3
        self.d=x4
        self.m=A.func(self)#同样必须传入self
        self.n=self.func()
>>>ins=B(1,2,10,20)
>>>print(ins.a,ins.b,ins.c,ins.d)
1 2 10 20
>>>print(ins.m,ins.n)
3 3
>>>print(ins.func())
3     

对于方式2,代码:

class A:
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def func(self):
        return self.a+self.b

class B(A):
    def __init__(self,x1,x2,x3,x4):
        super().__init__(a=x1,b=x2)#初始化父类参数,注意不需要self了
        self.c=x3
        self.d=x4
        self.m=super().func()#super()同样能调用父类的方法
        self.n=self.func()#也可以直接调用父类方法
>>>ins=B(1,2,10,20)
>>>print(ins.a,ins.b,ins.c,ins.d)
1 2 10 20
>>>print(ins.m,ins.n)
3 3
>>>print(ins.func())
3

对于方式1,显示调用进行初始化,在多重继承的时候可能会出现重复调用的问题,如:

class A:
    def __init__(self,a,b):
        self.a=a
        self.b=b
        print('AAAAA')
    def func(self):
        return self.a+self.b

class B(A):
    def __init__(self,x1,x2,x3,x4):
        A.__init__(self,a=x1,b=x2)
        self.c=x3
        self.d=x4
        print('BBBBB')

class C(A):
    def __init__(self,m,n,q):
        A.__init__(self,m,n)
        self.q=q
        print('CCCCC')

class D(B,C):
    def __init__(self,a,b,c,d,e,f):
        B.__init__(self,a,b,c,d)
        C.__init__(self,a,b,e)
        self.f=f
        print('DDDDDD')
>>>ins=D(1,2,3,4,5,6)
AAAAA
BBBBB
AAAAA
CCCCC
DDDDDD

可以看到,A被调用了两次。因为D继承了B和C,在初始化B的时候,首先会初始化A,然后初始化B;在初始化C的时候,也会先初始化A,再初始化C;因此A就被初始化了两次。

另一个问题是,

而用super()虽然可以避免重复调用这个问题,但是在父类均有参数需要初始化时就很麻烦:

class A:
    def __init__(self):
        print('AAAAA')
    def func(self):
        return self.a+self.b

class B(A):
    def __init__(self):
        super().__init__()
        print('BBBBB')

class C(A):
    def __init__(self):
        super().__init__()
        print('CCCCC')

class D(B,C):
    def __init__(self):
        super().__init__()
        print('DDDDDD')
>>>ins=D()
AAAAA
CCCCC
BBBBB
DDDDDD
#可见,确实可以避免重复调用的问题。

但是,如果父类均有参数,那么这个时候问题就很大了,如:

class A:
    def __init__(self,a,b):
        self.a=a
        self.b=b
        print('AAAAA')
    def func(self):
        return self.a+self.b

class B(A):
    def __init__(self,x1,x2,x3,x4):
        super().__init__(x1,x2)
        self.c=x3
        self.d=x4
        print('BBBBB')

class C(A):
    def __init__(self,m,n,q):
        super().__init__(m,n)
        self.q=q
        print('CCCCC')

class D(B,C):
    def __init__(self,a,b,c,d,e,f):
        super().__init__(a,b,c,d)##这种情况下,因为是按照MRO法则来以此对所有父类进行初始化,因此这里无论怎么传参数,都是有可能报错的。因为不同父类的入参不同。根据后面查看的MRO顺序,调用顺序是D-B-C-A,因此这里初始化的时候IDE会提示输入4个参数,因为首先调用的是B,而B的初始化需要4个参数。

        self.f=f
        print('DDDDDD')
        
>>>ins=D(1,2,3,4,5,6)

TypeError: __init__() missing 1 required positional argument: 'q'
        
>>>print(D.__mro__)#查看D的父类调用MRO顺序
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
#因此。可以看到,首先调用的是B,初始化成功;而在初始化C的时候报错,C中的m,n都是初始化A,而A已经在前一步初始化过了。但是因为所有的参数都进了B,现在初始化C的时候缺一个参数q,因此报错。

对于带参数的多重继承问题,另一个同样的例子可以参考来理解:https://www.pythonf.cn/read/147692

因此,对于带参数的多重继承问题,使用super()会非常难用,不如使用显示调用,带来的小问题是部分类会重复初始化。

更进一步,在python中尽量不要使用多重继承,会让结构显得非常复杂,代码也变得脆弱。在单继承场景中,则显示调用或者super()都可以使用,注意,要么全部类都显示调用,要么全部都用super()

Kotlin原生AI Agent框架Koog:为JVM开发者打造类型安全、企业级智能体开发方案 AI Agent作为当前人工智能应用开发的核心范式,通过赋予大语言模型(LLM)自主规划、工具调用和环境交互能力,正在重塑软件智能化进程。其技术原理基于智能体架构,通过提示工程、函数调用和记忆机制,将LLM从单纯的文本生成器转变为能够执行复杂任务的工作流引擎。这一技术价值在于显著降低了构建智能应用的开发门槛,同时保持了高度的灵活性和可扩展性。在实际应用场景中,AI Agent广泛落地于智能客服、代码助手、数据分析自动化等领域,成为连接大模型能力与具体业务需求的关键桥梁。本文聚焦的Koog框架,正是针对JVM 阅读详情

相关推荐

Win10 LTSC 2021 CPU占用率飙升?KB5017308补丁修复全攻略

本文针对Windows 10 LTSC 2021系统中因wsappx进程导致的CPU占用率异常飙升问题,提供了详细的解决方案。核心在于安装微软官方发布的KB5017308补丁,该补丁能从根本上修复系统组件缺陷,使CPU占用恢复正常。文章详解了补丁的下载、安装步骤、注意事项及安装后的验证方法,是解决此问题的权威指南。

python9snake的博客 1267

super、继承

super、继承

技术改变命运,创新驱动中国 2104

Oracle Linux中/var/log/pcp/pmlogger目录膨胀问题分析与解决

本文详细分析了Oracle Linux系统中/var/log/pcp/pmlogger目录异常膨胀的常见原因与解决方案。当PCP性能监控框架的pmlogger服务日志轮转或清理机制失效时,会导致该目录无限增长,威胁系统稳定。文章提供了从服务状态诊断、配置文件审查到安全清理与预防策略的全流程实战指南,帮助运维人员快速回收磁盘空间并恢复服务正常运行。

weixin_29208327的博客 372

继承中的super关键字

③如果父类没有,则继续找父类的父类,整个规则,就是一样的,直到Object类。③在子类中,访问父类的构造器(只能在构造器中第一句使用,并只能出现一句)提示:如果查找方法的过程中,找到了,但是不能访问,则报错。分工明确,父类属性由父类初始化,子类的属性由子类初始化。①在子类中,访问父类的属性(不能访问父类的私有属性)②在子类中,访问父类的方法(不能访问父类的私有方法)②如果没有,则找父类(如果有,并可以调用,则调用)。如果查找方法的过程中,没有找到,则提示方法不存在。①先找本类,如果有,则调用。

m0_75013084的博客 361

AxMath行间公式转化为office公式求和符号以及编号显示问题

AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai​+bi2​比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中

weixin_43543177的博客 4650

Android 系统低内存lowmemorykiller关于阈值修改 minfreeAbsKbytes优化

在系统rom定制化开发中,在对于运行内存ram 1G和2G的设备中,对于内存使用高峰期时,minfreeAbsKbytes优化很关键 调整合理的minfree,让内存合理的使用很关键,接下来分析相关功能的实现

安卓兼职framework和app工程师的博客 524

继承的总结(super的使用)

文章目录继承成员变量继承方法构造函数 super:代表父类对象,在继承中有重要作用 ****子类继承父类,会继承父类非私有的成员变量和方法。 继承成员变量 子类和父类如果成员变量同名,则可以使用super.成员变量加以区分。 Fu 类中的成员变量是非私有的,子类中可以直接访问。若Fu 类中的成员变量私有了,子类是不能直接访问的。通常编码时,我们遵循封装的原则,使用private修饰成员变量,那么如何访问父类的私有成员变量呢?对!可以在父类中提供公共的getXxx方法和setXxx方法 继承方法 子类和父类如

qq_45981425的博客 686

Aurix TC3xx系列MCU ADC模块简介(一)

简单介绍英飞凌Aurix TC3xx系列单片机ADC模块的特点及内部结构。

m0_38045338的博客 6361

36. 继承与super关键字

面向对象编程中的继承机制允许子类复用父类代码并扩展功能。继承的核心概念包括父类与子类的关系、方法重写和super关键字的使用。方法重写让子类能修改父类方法的行为,需注意保持方法签名一致且访问权限不更严格。super()函数则用于调用父类方法,常见于子类初始化时。使用继承时需避免过度继承导致代码复杂,优先考虑组合而非继承。

weixin_43484713的博客 359

RK3588多核NPU并行加速yolo优化教程:基于线程池的高性能推理实现

本教程详细介绍了RK3588多核NPU的并行加速优化方法。RK3588搭载三个独立NPU核心,总计算能力达6TOPS,但传统单线程方式无法充分发挥其性能。文章从硬件架构分析入手,详细讲解了三核心独立处理架构和多种工作模式,并通过代码示例展示了线程池技术的实现原理。线程池通过预创建工作线程、任务队列和条件变量等核心组件,避免了频繁创建线程的开销,能显著提升NPU的并行处理效率。教程还提供了性能计算公式和内存带宽优化策略,帮助开发者最大化利用RK3588的硬件算力,实现高性能AI推理。

LXY_LOVE36的博客 1024

YOLO26涨点改进 | 全网独家创新、检测头Head改进篇 | AAAI 2026 | 使用StripConvHead改进YOLO26的检测头,处理小目标、遮挡小目标检测有效涨点,助力高效发论文

🔥本文给大家介绍使用StripConv条形卷积改进 YOLO26的检测头,可以显著提高模型在高纵横比物体检测、目标定位和多尺度物体检测方面的表现。StripConv条形卷积能够更有效地捕捉细长物体的特征,提升定位精度,并通过简化卷积核设计减少计算冗余,优化计算效率。此外,该改进增强了 YOLO26对复杂场景和实时任务的适应能力,特别适用于遥感图像目标检测、小目标检测等领域。具体怎么使用请看全文。摘要:随着遥感物体检测的快速发展,检测高纵横比物体仍然是一个挑战性问题。

Ai缝合怪、助力小伙伴高效发论文 268

继承-super详解

super对比this: super注意点: 1.super调用父类的构造方法,必须在构造方法的第一个 2.super必须只能出现在子类的方法或者构造方法中 3.super和this不能同时调用构造方法(因为都要放在构造方法的第一个) Vs this:代表的对象不同: this:本身调用者这个对象 super:代表父类对象的引用 前提 this:没有继承也可以使用 super:只能在继承条件才可以使用 ...

wuchen_922的博客 1691

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)

阿里云推出国内首个集成“快思考”与“慢思考”能力的 Qwen3-8B 大语言模型,以80亿参数和 128K 上下文支持,重塑AI应用边界并助力开发者高效部署

以微薄之力,予他人些许温暖. 2万+

Python类中的继承——super(包含super(子类, self).__init__()以及其他父类的方法)

Python类中的继承——super。 包含①super(子类, self).__init__();②其他父类的方法。

Le0v1n 的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Python类中的super方法在多继承中的用法(一个例子看懂super()的使用方法)

Python类中如何调用父类? 直接写父类的名字 使用不带参数的super()方法 使用带参数的super(父类)方法 第1种方法比较简单,直接在调用的时候指定父类名称即可。但是这种直接使用的方式会有一个副作用,当存在多重继承的时候,父类的初始化方法会被多次调用。解决方法就是使用不带参数的super方法,该方法会使用一个D3算法,该算法会确保所有类的初始化方法仅仅调用一次。看例子: class...

freflying1119的博客 446

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java继承类时提示构造函数缺少_java – 没有继承的类的构造函数中的super()

参见英文答案 > super keyword without extends to the super class2个我在Java Video-Tutorial中看到过以下代码(类的缩写版本).public class Address {private String firstName;private String la...

weixin_42513296的博客 413

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

关于Python中的super()方法介绍

super(B,self).minus(m)明明是调用了父类的minus方法,可是输出结果就是2,是你要明白现在B的实例,而不是A的实例,那么传递的self.n的数值是7,而不是10.经典类是一种没有继承的类,实例类型都是type类型,如果经典类被作为父类,子类调用父类的构造函数时会返回这样的错误 '''TypeError: must be type, not classobj'''在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现。

xiaoweids的博客 232

【python】类继承中super的用法

python中的继承与super()的使用

芳樽里的歌的博客 7703

python类中super()

Python中类的初始化都是__init__(), 所以父类和子类的初始化方式都是__init__(), 但是如果子类初始化时没有这个函数,那么他将直接调用父类的__init__(); 如果子类指定了__init__(), 就会覆盖父类的初始化函数__init__(),如果想在进行子类的初始化的同时也继承父类的__init__(), 就需要在子类中显示地通过super()来调用父类的__init_...

shuijinghua的博客 1万+

python super类继承

class Parent(object): def __init__(self): self.parent = 'I am the parent' print('parent') def bar(self, message): print(message, 'from parent') class FooChile(Parent...

one city one love 1003

Python类中的继承——super(包含super(子类, self).__init__()以及其他父类的方法

Python类中的继承——super(包含super(子类, self).__init__()以及其他父类的方法

qq_35568823的博客 304

python之super()函数 #单类继承&多类继承 #super()使用debug过程

文章目录描述语法python2和python3使用super()区别super()单类继承super()多类继承super()使用debug过程 描述 super() 函数是用于调用父类(超类)的一个方法。 super 是用来解决多重继承问题的。(当然,单继承也可以用。) 多重继承,也就是我们可以为一个类同时指定多个父类。 直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。 MRO 就是类的方法解析顺序表, 其实也就是继承父类

夏普通 2073

super() 和super(props)有什么区别

super():调用父类的默认构造函数,当父类不需要特定的初始化参数时使用。super(props):在React组件中,将 props 从子类构造函数传递给父类构造函数,这允许父类在初始化时使用这些 props。如果你正在编写一个React组件,并且这个组件继承自另一个React组件,那么通常你会使用 super(props) 来确保父组件可以访问其 props。如果你没有继承任何特定的React组件,而是从React.Component或其他基础类继承,那么你可能只需要简单地调用 super()。

weixin_43867229的博客 860

理解Python中super()

参考资料: https://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods https://my.oschina.net/jhao104/blog/682322

SnailTyan 4055

super()在程序中的实现与Object类中的toString()方法的实现

我是一个初学者,在学Java过程中,将自己发现的一些问题与和我遇到一样的朋友们分享。人生第一次写博客,所有都是个人见解,请勿喷。 下面将探讨的是super()在程序中的实现与Object类中的toString()方法的实现。 import java.util.Date; class TV { String name; public TV() { } public TV(S

chasing_the_sun的博客 1947

python继承及super()函数

python继承及super() 函数介绍

hinewcc的博客 1225
上一篇: python中的下划线
下一篇: 创建装饰器时保留元信息
千翻娃儿
博客等级 码龄8年 5粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值