python继承中super().__init__() 与 xxxClass.__init__(self)的区别

示例:xxxClass.init(self)继承

class BaseClass(object):
    def __init__(self):
        print("构造 BaseClass")


class MyClass1(BaseClass):
    def __init__(self):
        BaseClass.__init__(self)
        print("构造 MyClass1")


class MyClass2(BaseClass):
    def __init__(self):
        BaseClass.__init__(self)
        print("构造 MyClass2")


class SubClass(MyClass1, MyClass2):
    def __init__(self):
        print("子类构造 MyClass1:")
        MyClass1.__init__(self)
        print("子类构造 MyClass2:")
        MyClass2.__init__(self)


sub_class = SubClass()

效果:

子类构造 MyClass1:
构造 BaseClass
构造 MyClass1
子类构造 MyClass2:
构造 BaseClass
构造 MyClass2

可以看到子类会按部就班的依次继承,在构造MyClass1的时候

示例:super().init()

class BaseClass(object):
    def __init__(self):
        print("构造 BaseClass")


class MyClass1(BaseClass):
    def __init__(self):
        super().__init__()
        print("构造 MyClass1")


class MyClass2(BaseClass):
    def __init__(self):
        super().__init__()
        print("构造 MyClass2")


class SubClass(MyClass1, MyClass2):
    def __init__(self):
        print("子类构造 MyClass1:")
        super().__init__()
        print("子类构造 MyClass2:")
        super().__init__()


sub_class = SubClass()

效果:

子类构造 MyClass1:
构造 BaseClass
构造 MyClass2
构造 MyClass1
子类构造 MyClass2:
构造 BaseClass
构造 MyClass2
构造 MyClass1

可以看到:super().__init__()也是可以满足继承的,但是我们调试的时候会发现,运行顺序是:

  1. SubClass__init()__
  2. MyClass1__init()__
  3. MyClass2__init()__
  4. BaseClassprint("构造 BaseClass")
  5. (看第3步)MyClass2print("构造 MyClass2")
  6. (看第2步)MyClass1print("构造 MyClass1")
  7. (看第1步)SubClass的后续操作:print("子类构造 MyClass2:")

两者的区别

所以两者都是会调用父类的方法,区别在于:

  • xxxClass.__init__(self)会调用一次父类的__init(self)__,可以把这个理解为执行了一次父类的__init__()函数
  • super().__init__()并不是在调用方法,而是按照继承顺序,执行下一个没有初始化的类。在第二个示例中,因为SubClass继承了两个类,一个是MyClass1,一个是MyClass2,所以这个方法会依次执行这两个类的__init()__

super().__init()不太好理解,见下一个示例:

class BaseClass(object):
    def __init__(self):
        print("构造 BaseClass")


class MyClass1(BaseClass):
    def __init__(self):
        super().__init__()
        print("构造 MyClass1")


class MyClass2(BaseClass):
    def __init__(self):
        super().__init__()
        print("构造 MyClass2")


class SubClass(MyClass1, MyClass2, BaseClass): # 这里,多继承了一个BaseClass
    def __init__(self):
        print("子类构造 MyClass1:")
        super().__init__()
        print("子类构造 MyClass2:")
        super().__init__()


sub_class = SubClass()

输出结果与第二个一样,虽然程序在SubClass那里多继承了一个,但是因为已经初始化了,所以就直接跳过了

在实际使用时,建议使用super().__init__(),可以防止多次调用同一个类的初始化

参考链接

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

呆萌的代Ma

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

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

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

打赏作者

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

抵扣说明:

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

余额充值