理解super().__init__()

2023-10-29

一、写在前面:本文仅为个人的理解,如有错误欢迎指正

二、super().init()的含义

我们都知道是在定义子类的__init__方法的时候,由于需要继承父类的属性,则我们需要使用到super(),那么有些情况super().__init__()里面不带参数,有些时候要写成super().__init__(*wargs, **kwargs)这就让人有些迷惑了,这里写出一点自己的理解。

三、代码实验

首先我们定义一个车辆类

class Car(object):
    def __init__(self, owner, year, model):
        self.owner = owner
        self.year = year
        self.model = model 

    def get_info(self):
        """打印车辆信息"""
        print(f'The owner of the car is {self.owner}\n' \
             f'The model of the car is {self.year}-{self.model}')

查看一下这个类是否正常工作

ferrari = Car('Jarry', '2021', 'Roma')
ferrari.get_info()

输出的结果:

The owner of the car is Jarry
The model of the car is 2021-Roma

但这个时候我又想定义一个车类的子类,比如电动汽车类,那么我就应该继承Car类来减少代码量。但是为了使用Car类的属性和方法,我继承了Car类,那么我该如何初始化我的子类呢?

第一种方法
我只需要写我子类所需要的属性,然后父类需要的属性我用*wargs来表示,然后在__init__函数中,首先初始化我的子类的属性,将父类需要的属性打包成*wargs送入super()中

class ElectricalCar(Car):
    def __init__(self, battery, *wargs):
        super().__init__(*wargs)  # 将剩下的参数打包送给super
        self.battery = battery  # 从参数列表中拿出battery初始化子类属性
    
    def get_power(self):
        """打印电池信息"""
        print(f'The battery of this car is {self.battery}')

测试一下是否能正常工作,我们实例化一下这个电动汽车类

tesla = ElectricalCar('10000kwh','Jarry', 2021, 'Model S')
tesla.get_info()
tesla.get_power()

结果:

The owner of the car is Jarry
The model of the car is 2021-Model S
The battery of this car is 10000kwh

看来我们这样继承是正确的

第二种方法:
我们的父类Car由三个参数,我们定义了一个ElectricCar需要一个额外参数,那么总参数量一共是3+1=4个,如果我们把这四个参数都写出来,那不是也可以顺利继承父类。其实也可以这么做

class ElectricalCar(Car):
    def __init__(self, battery, owner, year, model):
        super().__init__(owner, year, model)
        self.battery = battery
    
    def get_power(self):
        """打印电池信息"""
        print(f'The battery of this car is {self.battery}')

测试一下

tesla = ElectricalCar('10000kwh','Jarry', 2021, 'Model S')
tesla.get_info()
tesla.get_power()

结果:

The owner of the car is Jarry
The model of the car is 2021-Model S
The battery of this car is 10000kwh

看来把参数全部写出来也是正确的,只不过这相对于第一种方法比较麻烦,但是这种方法可以方便我们理解super().__init__()

四、理解super().init()

super()是继承父类,那么super().__init__()代表不用实例化就可以调用父类的__init__()方法来对子类进行初始化,那么这就相当于我们实例化了一个对象,那当然需要给super().__init__()指定它的参数了,那么这样一来上面的两种方法就更好理解了。
第一种方法super().__init__(*wargs)我们使用了任意数目的关键字参数符号*wrags来传入参数
第二种方法super().__init__(owner, year, model)我们使用了有限的参数直接进行传入

更好的方式super().__init__(*wargs, **kwargs)

实质:
灵活的方法是让祖先树中的每个方法协同设计以接受关键字参数和关键字参数字典,删除它需要的任何参数,并使用 **kwds 转发剩余的参数,最终将字典留空用于链中的最后一次调用。
每个级别都会剥离它需要的关键字参数,以便最终的空字典可以发送到一个根本不需要参数的方法(例如,object.__init__需要零参数)

五、Reference

https://rhettinger.wordpress.com/2011/05/26/super-considered-super/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解super().__init__() 的相关文章

  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from

随机推荐

  • P4 晶体管四种工作状态+静态分析【更新】

    gt 晶体管四种工作状态 放大 饱和 截止 倒置 gt 静态分析 定量分析晶体管处于何种工作状态 注意 不安全区暂时不用关注 倒置状态暂时也可以不关注 放大区 之所以称为放大区 因为在这个区域 iB 与iC满足放大beta倍的关系 这是表面
  • getopt函数(未更新完)

    2023年7月28日 周五上午 这是我目前碰到过的比较复杂的函数之一 为了彻底弄懂这个函数 我花了几个小时 为了更好的说明这个函数 之后我可能会录制讲解视频并上传到B站 如果我上传到B站 我会在文章添加视频链接的 内容太多了 没写完 有空再
  • java Logback输出日志内容到文件

    要将logger info的信息输出到文件 您可以使用Logback配置 下面是一个简单的示例 1 首先 在您的项目中添加Logback依赖 例如在Maven项目中的pom xml文件中添加以下代码
  • 基于OpenCV的交通标志识别(SVM+Hu不变矩, 部分测试源代码)

    最近跟着老师做一个交通识别的项目 总算明白了一个道理 这水啊 不去亲自蹚上一遭就不知道有多深 更根本的原因当然还是自己学的不够扎实 不够好 经过了一个寒假的折磨 终于做出了一个原型来 想到了自己当时被折磨的头疼的样子 想着将一部分源代码发上
  • 前端post请求中body和query传参的区别

    前端发送请求最常用的是get请求还有post请求 get请求只能传query参数 query参数都是拼在请求地址上的 post可以传body和query两种形式的参数 如下 编辑项目列表 export function editProjec
  • SeqGPT: 开箱即用的开放域自然语言理解大模型

    论文链接 SeqGPT An Out of the box Large Language Model for Open Domain Sequence Understanding https arxiv org abs 2308 10529
  • 【DL】血与泪的炼丹心得

    记录一些炼丹的心得 都是坑啊 以下都是经过很多实验得到的炼丹心得 希望对大家有帮助 模型很复杂 各种网络融合 尝试用更小的学习率和更多的epoch 学习率预热是个好东西 必须用上 学习率很重要 可以发掘模型的极限 但是无法改变模型的上限 模
  • DataAnalysis-Maggie-Lecture6-机器学习基础

    ML的基础框架 1定义要解决的问题 2构建数据集 3数据变换 4训练模型 5使用模型预测 example 垃圾邮件标记系统来解释术语 Dataset 一堆的邮件 Sample Instances 一封邮件 Feature Variables
  • springcloud微服务:nacos的配置说明与服务注册

    这部分我要知道两点就是nacos如何去注册服务和发现服务的 一 工程结构和版本依赖 首先要说一个我们的springcloud工程 基于半仙的springcloud工程 这个工程比较有意思 就是我很少看到pom文件一层套一层 相当于是三级po
  • 修改el-card的header的背景颜色

    修改el card的header的背景颜色 1 修改默认样式 好处是当前页面的所有的el card都会变化 页面卡片
  • linux0.00 代码阅读笔记

    汇编语言的编写 编译 运行 调试 author hjjdebug date 参考代码地址 GitHub hjjdebug linux0 00 linux0 00 code compiled under ubuntu14 04 gcc 4 8
  • Vue3的基本语法及使用(vue3尚硅谷学习笔记)

    一 Vue3的基本语法及使用 1 Vue3的基本语法 1 1 初识setup setup是Vue3中一个新的配置项 值为一个函数 组件中所要用到的数据 方法等 均要配置在setup中 setup的两种返回值 若返回一个对象 则对象中的属性
  • QT编程常见崩溃问题总结

    一 主程序事件循环函数崩溃 a exec 处崩溃 该处崩溃一般调试的时候显示的堆栈信息停止的位置都是QT的dll库 我们的代码中只给出了a exec 崩溃 原因一 子线程中更改界面上控件 在Qt事件循环中一般只有主线程可以用来改变某一个显示
  • CFSum: A Coarse-to-Fine Contribution Network for MMS

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 作者 肖敏 朱军楠 林海涛 周玉 宗成庆 单位 中国科学院自动化研究所 邮箱 min xiao nlpr ia ac cn 1 摘要 多模式摘要通常存在一个问题 即视觉模态的贡献
  • 推荐10个堪称神器的 Java 学习网站

    经常有一些读者问我 二哥 学习 Java 应该关注哪些网站 我之前的态度一直是上知乎 上搜索引擎搜一下不就知道了 但读者对我这个态度很不满意 他们说 我在问你 又不是问知乎 问搜索引擎 你还别说 读者说得有道理 于是我想 那就推荐一些吧 先
  • 【人工智能

    一 什么是多模态 多模态 multimodal 是指涉及到多种模态 如视觉 语音 文本等 的数据或信息 在计算机科学和人工智能领域中 多模态通常指将多种类型的数据或信息相结合 来解决特定的问题或任务 以图像识别为例 图像可以被视为一种视觉模
  • 域中DC和AD的区别

    今天朋友问我DC和AD的区别时 我也是一脸懵X 所以我查了一些资料 做个小总结 域 我的理解是他就是一个架构 和工作组类似 和工作组最大的区别就是 工作组没有管理者 而域可以集中管理 再详细一点的解释就是在工作组上你一切的设置比如在本机上进
  • Vue引入并使用Element-UI组件库的两种方式

    前言 在开发的时候 虽然我们可以自己写css或者js甚至一些动画特效 但是也有很多开源的组件库帮我们写好了 我们只需要下载并引入即可 vue和element ui在开发中是比较般配的 也是我们开发中用的很多的 下面就介绍下如何在eue项目中
  • 博图db块变量导出_博途中,DB里定义的变量的改变

    问题描述 1 新的博途中 生成一个全局DB 打开 在第一行自动生成了 名称 为static的变量 名称无法修改 数据类型无法选择 而在老版的STEP7里 分明是一个无名称 数据类型是STRUCT 无法重新选择 的变量 为什么做了这样的改变
  • 理解super().__init__()

    目录 一 写在前面 本文仅为个人的理解 如有错误欢迎指正 二 super init 的含义 三 代码实验 四 理解super init 五 Reference 一 写在前面 本文仅为个人的理解 如有错误欢迎指正 二 super init 的