super().__init__()
是用于在 Python 中调用父类(也称为超类或基类)的构造方法(__init__
方法)的一种方式。这通常在子类的构造方法中使用,以便在添加子类特有的功能之前,初始化父类中定义的属性和执行其他必要的设置。
super()用来调用父类(基类)的方法,__init__()
是类的构造方法,
super().__init__()
就是调用父类的__init__()
方法, 同样可以使用super()去调用父类的其他方法。
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
属性,这样就同时包括了父类和子类的属性。
super().__init__()
和 super(Child, self).__init__()
的区别super().__init__()
和 super(Child, self).__init__()
都是用于调用父类的构造方法,但它们之间有一个重要的区别:
super().__init__()
: 这种方式不需要显式传递当前类和实例(self
)作为参数,Python会自动识别当前类和实例。这是一种简化的写法,通常用于单继承的情况。
super(Child, self).__init__()
: 这种方式明确指定了当前类(Child
)和实例(self
)作为参数传递给 super()
。这种方式通常在多继承的情况下使用,以明确指定要调用哪个父类的构造方法。
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)继承父类中,第一个父类的构造方法。
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__()
继承的是声明类的下一个父类