理解super().__init__()

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

二、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/

  • 46
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 不一定需要写super().__init__()。在定义子类的__init__方法时,如果子类没有特殊需求,可以不写super().__init__()。因为在子类中重写了父类的属性后,调用super().__init__()是多余的。即使删除这句代码,也不会对程序产生影响。然而,如果需要在子类中调用父类的__init__方法进行初始化,可以使用super().__init__()来实现。此时,可以选择使用任意数目的关键字参数符号*wargs来传递参数,或者直接传入有限的参数,如super().__init__(owner, year, model)。所以说,是否写super().__init__()取决于子类的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [理解super().__init__()](https://blog.csdn.net/qq_44940689/article/details/122144051)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [super().__init__()用法](https://blog.csdn.net/weixin_30276935/article/details/99562153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值