前言https://www.csdn.net/tags/MtTaMgzsMzc5MDAtYmxvZwO0O0OO0O0O.html 在Python类的继承中,经常能看到super函数的存在,那super函数主要的作用,以及如何理解和使用好这个函数?本次教程将详细讲解,希望大家看到最后,并按照代码实际操作下。 常见用途我们举一个简单例子,我们父类是Human,有两个属性,分别是姓名和性别;然后定义一个子类Student。 class Human: def __init__(self, name, sex): self.name = name self.sex = sex print('parent') class Student(Human): pass stu_1 = Student('lisi', 'male') print(stu_1.name) parent lisi 这里Student没有构造函数,所以会去父类中寻找构造函数。这时候我们需要在子类中加入构造函数,并需要name,sex,score三个属性,那我们如果直接写就应该是下面这种代码。 class Human: def __init__(self, name, sex): self.name = name self.sex = sex print('parent') class Student(Human): def __init__(self, name, sex, score): self.name = name self.sex = sex self.score = score print('child') stu_1 = Student('lisi', 'male', 97) print(stu_1.score) child 97 你会发现父类和子类都有相同的两行代码。 self.name = name self.sex = sex 这显然和我们优雅的Python格格不入,所以super函数来了,我们直接看代码。 class Human: def __init__(self, name, sex): self.name = name self.sex = sex print('parent') class Student(Human): def __init__(self, name, sex, score): super().__init__(name, sex) self.score = score print('child') stu_1 = Student('lisi', 'male', 97) print(stu_1.score) parent child 97 通过代码我们可以看出,super函数常常用于子类的构造函数中,用于调用父类(超类)的构造函数,并且不会显式引用基类。 之所以说不用显式引用基类,是因为通过调用父类方法也能实现功能。 class Human: def __init__(self, name, sex): self.name = name self.sex = sex print('parent') class Student(Human): def __init__(self, name, sex, score): Human.__init__(self, name, sex) self.score = score print('child') stu_1 = Student('lisi', 'male', 97) print(stu_1.score) parent child 97 理解super函数我将通过下面几个进阶的知识点让你理解super函数。 首先我们还是来总结下super函数的语法。 super(type[, object-or-type]) super(Student, self).__init__() #python2写法 super().__init__() #python3写法 不仅仅是用于构造函数super函数虽常用于构造函数,但是父类的其他函数一样也是可以用super函数的。 class A: def add(self, x): y = x + 1 print(y) class B(A): def add(self, x): super().add(x) b = B() b.add(2) # 3 之所以不常用,我认为是既然继承了父类,那子类就可以直接调用父类的方法,这样做只是多此一举。 class A: def add(self, x): y = x + 1 print(y) class B(A): pass b = B() b.add(2) # 3 多重继承可能就不一样了根据上面的案例,我们可以看出super函数是直接调用基类的构造函数,但是多重继承不一样,他是调用继承顺序的下一个类,而不是父类。 class Base: def __init__(self): print("enter Base") print("leave Base") class A(Base): def __init__(self): print("enter A") super().__init__() print("leave A") class B(Base): def __init__(self): print("enter B") super().__init__() print("leave B") class C(A, B): def __init__(self): print("enter C") super().__init__() print("leave C") C() enter C enter A enter B enter Base leave Base leave B leave A leave C 继承关系为C—A—B—Base,所以程序会先去A,再到B,最后到Base。 super函数和直接调用父类方法的区别在单继承时,我们看到super和直接调用父类方法得到的结果是一样的,只是不会显式引用基类。但多重继承就不要了,我把上面的代码进行了修改,我相信你能看懂区别。 class Base: def __init__(self): print("enter Base") print("leave Base") class A(Base): def __init__(self): print("enter A") Base.__init__(self) print("leave A") class B(Base): def __init__(self): print("enter B") Base.__init__(self) print("leave B") class C(A, B): def __init__(self): print("enter C") A.__init__(self) B.__init__(self) print("leave C") C() enter C enter A enter Base leave Base leave A enter B enter Base leave Base leave B leave C 最后,由于本人时间和能力有限,如有错误,请批评指正,我们下期再见~ |
|