super().__init__()函数

文章介绍了Python中super().__init__()的基本用法,以及它与super(Child,self).__init__()的区别,特别是在单继承和多继承场景下的应用。重点讲解了参数传递方式和在多继承中的选择策略。
摘要由CSDN通过智能技术生成

super().__init__() 是用于在 Python 中调用父类(也称为超类或基类)的构造方法(__init__ 方法)的一种方式。这通常在子类的构造方法中使用,以便在添加子类特有的功能之前,初始化父类中定义的属性和执行其他必要的设置。

super()用来调用父类(基类)的方法,__init__()是类的构造方法,
super().__init__() 就是调用父类的__init__()方法, 同样可以使用super()去调用父类的其他方法。

1.super().__init__()基本用法

以下是一个基本示例,展示了如何在子类的构造方法中使用 super().__init__()

class Parent:
    def __init__(self, name):
        self.name = name

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)  # 调用父类的构造方法以初始化 name
        self.age = age #添加自定义age属性

child = Child("Alice", 25)
print(child.name)  # 输出 "Alice"
print(child.age)   # 输出 25

在上面的示例中,子类 Child 的构造方法首先调用了父类 Parent 的构造方法,以确保 name 属性被正确初始化,然后再添加了 age 属性,这样就同时包括了父类和子类的属性。

2.super().__init__()super(Child, self).__init__() 的区别

super().__init__()super(Child, self).__init__() 都是用于调用父类的构造方法,但它们之间有一个重要的区别:

(1)参数传递方式:

  • super().__init__(): 这种方式不需要显式传递当前类和实例(self)作为参数,Python会自动识别当前类和实例。这是一种简化的写法,通常用于单继承的情况。

  • super(Child, self).__init__(): 这种方式明确指定了当前类(Child)和实例(self)作为参数传递给 super()。这种方式通常在多继承的情况下使用,以明确指定要调用哪个父类的构造方法。

(2)多继承中的 super().__init__()

如果你的类是多继承的,使用 super(Child, self).__init__() 可以更明确地控制调用的是哪个父类的构造方法,因为 super() 可以基于参数中的当前类(Child)找到正确的父类。

下面是一个多继承的示例,演示了使用super().__init__()super(Child, self).__init__() 的区别:

class Parent1:
    def __init__(self):
        print("Parent1 constructor")

class Parent2:
    def __init__(self):
        print("Parent2 constructor")

class Parent3:
    def __init__(self):
        print("Parent3 constructor")

class Child(Parent1,Parent2,Parent3):    # 顺序为Parent1,Parent2,Parent3
    def __init__(self):
        super().__init__()               # 使用简化写法,调用了 Parent1 的构造方法
child = Child()
#输出结果:Parent1 constructor

接下来我们将Child继承父类中Parent1,Parent2的顺序进行调换,运行结果如下:

#把Parent1,Parent2的顺序进行调换
class Parent1:
    def __init__(self):
        print("Parent1 constructor")

class Parent2:
    def __init__(self):
        print("Parent2 constructor")

class Parent3:
    def __init__(self):
        print("Parent3 constructor")

class Child(Parent2,Parent1,Parent3):    # 顺序为Parent2,Parent1,Parent3
    def __init__(self):
        super().__init__()               # 使用简化写法,调用了 Parent2 的构造方法
child = Child()
#输出结果:
#Parent2 constructor

在上面的示例中,我们可以知道,在多继承的情况下,super().__init__() 调用的是子类(Child)继承父类中,第一个父类的构造方法。

(3)多继承中的 super(Child, self).__init__()

class Parent1:
    def __init__(self):
        print("Parent1 constructor")

class Parent2:
    def __init__(self):
        print("Parent2 constructor")

class Parent3:
    def __init__(self):
        print("Parent3 constructor")

class Child(Parent1, Parent2,Parent3):
    def __init__(self):
        super(Child, self).__init__()     # 调用Child下一个父类的构造方法,即Parent1
        super(Parent2, self).__init__()   # 调用Parent2下一个父类的构造方法,即Parent3

child = Child()
#输出结果:
#Parent1 constructor
#Parent3 constructor

在上面的示例中,super(Child, self).__init__() 输出了Parent1 constructor,super(Parent2, self).__init__()输出了Parent3 constructor。

综上,我们可以知道,在多继承中,super().__init__() 继承的是子类继承的第一个父类,super(Parent2, self).__init__() 继承的是声明类的下一个父类

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值