Python 类继承
在面向对象的程序设计中,定义一个新的 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类,而被继承的 class 称为基类、父类或超类。
Python 中继承的语法如下:
class Parent:passclass Child(Parent):pass
在第 1 行,定义了父类 Parent;
在第 4 行,定义了子类 Child,语法 Child(Parent) 表示类 Child 继承于类 Parent。
子类继承父类的属性和方法,使得子类具有父类的属性和方法,从而实现代码重用;同时,子类可以增加自己特有的方法。例如,下图中定义了 3 个类,类 Teacher 与类 Student 继承于类 Person,如图所示:
1. 在子类中增加属性和方法
1.1 编写父类 Person
class Person:def __init__(self, name, age):self.name = name self.age = agedef introduce(self):print('My name is', self.name)print('My age is', self.age)
1.2 编写子类 Teacher
class Teacher(Person):def __init__(self, name, age, salary):self.name = name self.age = age self.salary = salarydef showSalary(self):print('My salary is', self.salary)
在第 1 行,通过语法 Teacher(Person),定义继承于 Person 的类 Teacher
1.3 编写子类 Student
class Student(Person):def __init__(self, name, age, grade):self.name = name self.age = age self.grade = gradedef showGrade(self):print('My grade is', self.grade)
在第 1 行,通过语法 Student(Person),定义继承于 Person 的类 Student
1.4 创建实例
teacher = Teacher('tom', , )teacher.introduce()teacher.showSalary()print()student = Student('jerry', , )student.introduce()student.showGrade()
在第 1 行,创建实例 teacher
在第 5 行,创建实例 student
运行程序,输出如下结果
My name is tom My age is 30 My salary is 5000 My name is jerry My age is 10 My grade is 90
2. 在子类中调用父类的构造方法
2.1 代码重复的问题
在前面的小节中,类 Person 的构造方法如下:
class Person:def __init__(self, name, age):self.name = name self.age = age
类 Teacher 的构造方法如下:
class Teacher(Person):def __init__(self, name, age, salary):self.name = name self.age = age self.salary = salary
类 Student 的构造方法如下:
class Student(Person):def __init__(self, name, age, grade):self.name = name self.age = age self.grade = grade
2.2 编写父类 Person
class Person:def __init__(self, name, age):self.name = name self.age = agedef introduce(self):print('My name is', self.name)print('My age is', self.age)
2.3 编写子类 Teacher
class Teacher(Person):def __init__(self, name, age, salary):Person.__init__(self, name, age)self.salary = salarydef showSalary(self):print('My salary is', self.salary)
在第 1 行,通过语法 Teacher(Person),定义继承于 Person 的类 Teacher
在第 3 行,通过语法 Person.__init(self, name, age)__ 调用父类的构造方法 __init__,对属性 name 和 age 进行设置
2.4 编写子类 Student
class Student(Person):def __init__(self, name, age, grade):Person.__init__(self, name, age)self.grade = gradedef showGrade(self):print('My grade is', self.grade)
在第 1 行,通过语法 Student(Person),定义继承于 Person 的类 Student
在第 3 行,通过语法 Person.__init(self, name, age)__ 调用父类的构造方法 __init__,对属性 name 和 age 进行设置
2.5 创建实例
teacher = Teacher('tom', , )teacher.introduce()teacher.showSalary()print()student = Student('jerry', , )student.introduce()student.showGrade()
在第 1 行,创建实例 teacher
在第 5 行,创建实例 student
运行程序,输出如下结果
My name is tom My age is 30 My salary is 5000 My name is jerry My age is 10 My grade is 90
3. 多继承
定义一个新的 class 的时候,可以从多个现有的 class 继承,如果继承多个父类,称为多继承。Python 中多继承的语法如下:
class Father:passclass Mother:passclass Child(Father, Mother):pass
4. 多继承的例子
4.1 概述
本节构造 3 个类:Father、Mother 和 Child,Child 继承于两个类 Father 和 Mother,它继承了这两个类的属性和方法,同时有自己特有的属性和方法,如下图所示:
4.2 编写父类 Father
class Father:def __init__(self, father_attr):self.father_attr = father_attrdef father_method(self):print('father_attr =', self.father_attr)
4.3 编写父类 Mother
class Mother:def __init__(self, mother_attr):self.mother_attr = mother_attrdef mother_method(self):print('mother_attr =', self.mother_attr)
4.4 编写子类 Child
class Child(Father, Mother):def __init__(self, father_attr, mother_attr, child_attr):Father.__init__(self, father_attr)Mother.__init__(self, mother_attr)self.child_attr = child_attrdef child_method(self):print('child_attr =', self.child_attr)
在第 1 行,定义类 Child,继承于 Father 和 Mother
在第 7 行,定义类 Child 的方法 child_method
4.5 创建实例
child = Child('Father', 'Mother', 'Child') child.father_method()child.mother_method()child.child_method()
在第 1 行,创建实例 Child
程序输出结果如下:
father_attr = Father mother_attr = Mother child_attr = Child