python super().__init__的用法详解

一、前言

super(father).__init__()

目的:调用父类的__init__()函数进行初始化

2、应用场景:

class A():
    def __init__(self):
        self.a=100
        self.b='xxx'
        self.c=True
    def func1(self):
        pass

如上,有类A,现在想创建类B继承类A,但是类B的self.c需要改为False,我们尝试实现

class B(A):
    def func2(self):
        pass

好像 不行,又或者

class B(A):
    def __init__(self):
        self.c=False
    def func2(self):
        print(self.b)
b=B()
b.func2()
//会报错'B' object has no attribute 'b',因为你重写了__init__()

 很显然也不行,所以super(子类,self).__init__()发挥作用了

class B(A):
    def __init__(self):
        super(B,self).__init__()
        self.c=False
    def func2(self):
        print(self.b)
        print(self.c)
b=B()
b.func2()
输出:
xxx
False

成功了!!!

问题:super调用父类的init方法进行初始化,那当父类的init方法中有调用方法时,则这时候是调用父类的还是调用子类的呢(当然前提是子类有重写父类的方法)?

三、进阶理解

class A():
    def __init__(self,a,b):
        self.a=a
        self.b=b
        print(self.b)
        self.prints()
    def prints(self):
        print('self.A:',self.a)
class Zilei(A):
    def __init__(self,a):
        super(Zilei, self).__init__(a,a+1)
        self.a = a+100
        print('self.a:', self.a)
    def prints(self):
        print('self.b:',self.b)
ass=Zilei(1)

# 1/ 先执行super(Zilei, self).__init__(a,a+1),即执行A.__init__
# 所以输出print(self.b),即2
# 再执行self.prints() ,值得注意的是A.prints(),在子类zilei被重写,所以应该执行的是zilei.prints(),即输出:self.b:2
#2/返回到zilei.__init__执行print('self.a:', self.a) 输出 self.a:101

# 最终输出的结果:
# 2
# self.b:2
# self.a:101

看完上述分析,答案很明显是:调用子类重写后的方法

  • 18
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值