乐趣区

关于程序员:什么是-Python-类的继承和多继承

本文首发自「慕课网」,想理解更多 IT 干货内容,程序员圈内热闻,欢送关注!

作者 | 慕课网精英讲师 朱广蔚

在面向对象的程序设计中,定义一个新的 class 的时候,能够从某个现有的 class 继承,新的 class 称为子类,而被继承的 class 称为基类、父类或超类。

Python 中继承的语法如下:

class Parent:

pass

class Child(Parent):

pass

代码块 12345
在第 1 行,定义了父类 Parent;
在第 4 行,定义了子类 Child,语法 Child(Parent) 示意类 Child 继承于类 Parent。
子类继承父类的属性和办法,使得子类具备父类的属性和办法,从而实现代码重用;同时,子类能够减少本人特有的办法。例如,下图中定义了 3 个类,类 Teacher 与类 Student 继承于类 Person,如图所示:

父类 Person 定义了属性 name 和 age,定义了办法 introduce,这些属性和办法被子类继承
子类 Teacher 定义了本人特有的属性 salary,定义了本人特有的办法 showSalary
子类 Student 定义了本人特有的属性 grade,定义了本人特有的办法 showGrade

  1. 在子类中减少属性和办法
    1.1 编写父类 Person
    class Person:
    def __init__(self, name, age):

     self.name = name
     self.age = age
    

    def introduce(self):

     print('My name is', self.name)
     print('My age is', self.age)

    代码块 12345678
    在第 2 行,定义构造方法 __init__,设置属性 name 和 age
    在第 6 行,定义方法 introduce,打印属性 name 和 age
    1.2 编写子类 Teacher
    class Teacher(Person):
    def __init__(self, name, age, salary):

     self.name = name
     self.age = age
     self.salary = salary
    

    def showSalary(self):

     print('My salary is', self.salary)

    代码块 12345678
    在第 1 行,通过语法 Teacher(Person),定义继承于 Person 的类 Teacher
    在第 5 行,在构造方法中,减少类 Teacher 特有的属性 salary
    在第 7 行,定义方法 showSalary,打印属性 salary
    1.3 编写子类 Student
    class Student(Person):
    def __init__(self, name, age, grade):

     self.name = name
     self.age = age
     self.grade = grade
    

    def showGrade(self):

     print('My grade is', self.grade)

    代码块 12345678
    在第 1 行,通过语法 Student(Person),定义继承于 Person 的类 Student
    在第 5 行,在构造方法中,减少类 Student 特有的属性 grade
    在第 7 行,定义方法 showGrade,打印属性 grade
    1.4 创立实例
    teacher = Teacher(‘tom’, 30, 5000)
    teacher.introduce()
    teacher.showSalary()
    print()
    student = Student(‘jerry’, 10, 90)
    student.introduce()
    student.showGrade()
    代码块 1234567
    在第 1 行,创立实例 teacher 在第 2 行,调用父类办法 introduce 在第 3 行,调用本人特有的办法 showSalary
    在第 5 行,创立实例 student 在第 6 行,调用父类办法 introduce 在第 7 行,调用本人特有的办法 showGrade
    运行程序,输入如下后果

My name is tom
My age is 30
My salary is 5000

My name is jerry
My age is 10
My grade is 90
代码块 1234567
第 1 行到第 3 行,是 teacher 的输入后果
第 5 行到第 7 行,是 student 的输入后果

  1. 在子类中调用父类的构造方法
    2.1 代码反复的问题
    在后面的大节中,类 Person 的构造方法如下:

class Person:

def __init__(self, name, age):
    self.name = name
    self.age = age

代码块 1234
类 Teacher 的构造方法如下:

class Teacher(Person):

def __init__(self, name, age, salary):
    self.name = name
    self.age = age
    self.salary = salary

代码块 12345
类 Student 的构造方法如下:

class Student(Person):

def __init__(self, name, age, grade):
    self.name = name
    self.age = age
    self.grade = grade

代码块 12345
在这 3 段初始化代码中,存在显著的代码反复,咱们心愿:

初始化类 Teacher 的属性 name、age、salary 时,能够重用父类 Person 的初始化代码
初始化类 Student 的属性 name、age、grade 时,能够重用父类 Person 的初始化代码
2.2 编写父类 Person
class Person:

def __init__(self, name, age):
    self.name = name
    self.age = age

def introduce(self):
    print('My name is', self.name)
    print('My age is', self.age)

代码块 12345678
在第 2 行,定义构造方法 __init__,设置属性 name 和 age
在第 6 行,定义方法 introduce,打印属性 name 和 age
2.3 编写子类 Teacher
class Teacher(Person):

def __init__(self, name, age, salary):
    Person.__init__(self, name, age)
    self.salary = salary

def showSalary(self):
    print('My salary is', self.salary)

代码块 1234567
在第 1 行,通过语法 Teacher(Person),定义继承于 Person 的类 Teacher
在第 3 行,通过语法 Person.__init(self, name, age)__ 调用父类的构造方法 __init__,对属性 name 和 age 进行设置
在第 4 行,在构造方法中,减少类 Teacher 特有的属性 salary
在第 6 行,定义方法 showSalary,打印属性 salary
2.4 编写子类 Student
class Student(Person):

def __init__(self, name, age, grade):
    Person.__init__(self, name, age)
    self.grade = grade

def showGrade(self):
    print('My grade is', self.grade)

代码块 1234567
在第 1 行,通过语法 Student(Person),定义继承于 Person 的类 Student
在第 3 行,通过语法 Person.__init(self, name, age)__ 调用父类的构造方法 __init__,对属性 name 和 age 进行设置
在第 4 行,在构造方法中,减少类 Student 特有的属性 grade
在第 6 行,定义方法 showGrade,打印属性 grade
2.5 创立实例
teacher = Teacher(‘tom’, 30, 5000)
teacher.introduce()
teacher.showSalary()
print()
student = Student(‘jerry’, 10, 90)
student.introduce()
student.showGrade()
代码块 1234567
在第 1 行,创立实例 teacher 在第 2 行,调用父类办法 introduce 在第 3 行,调用本人特有的办法 showSalary
在第 5 行,创立实例 student 在第 6 行,调用父类办法 introduce 在第 7 行,调用本人特有的办法 showGrade
运行程序,输入如下后果

My name is tom
My age is 30
My salary is 5000

My name is jerry
My age is 10
My grade is 90
代码块 1234567
第 1 行到第 3 行,是 teacher 的输入后果
第 5 行到第 7 行,是 student 的输入后果

  1. 多继承
    定义一个新的 class 的时候,能够从多个现有的 class 继承,如果继承多个父类,称为多继承。Python 中多继承的语法如下:

class Father:

pass

class Mother:

pass

class Child(Father, Mother):

pass

代码块 12345678
在第 1 行,定义了父类 Father
在第 4 行,定义了父类 Mother
在第 7 行,定义了子类 Child,它继承于两个父类:Father 和 Mother
子类继承所有父类的属性和办法,从而实现代码重用。

  1. 多继承的例子
    4.1 概述
    本节结构 3 个类:Father、Mother 和 Child,Child 继承于两个类 Father 和 Mother,它继承了这两个类的属性和办法,同时有本人特有的属性和办法。

4.2 编写父类 Father
class Father:

def __init__(self, father_attr):
    self.father_attr = father_attr

def father_method(self):
    print('father_attr =', self.father_attr)

代码块 123456
在第 3 行,定义类 Father 的属性 father_attr
在第 5 行,定义类 Father 的办法 father_method
4.3 编写父类 Mother
class Mother:

def __init__(self, mother_attr):
    self.mother_attr = mother_attr

def mother_method(self):
    print('mother_attr =', self.mother_attr)

代码块 123456
在第 3 行,定义类 Mother 的属性 mother_attr
在第 5 行,定义类 Mother 的办法 mother_method
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_attr

def child_method(self):
    print('child_attr =', self.child_attr)     

代码块 12345678
在第 1 行,定义类 Child,继承于 Father 和 Mother
在第 3 行,调用父类 Father 的构造方法
在第 4 行,调用父类 Mother 的构造方法
在第 7 行,定义类 Child 的办法 child_method
4.5 创立实例
child = Child(‘Father’, ‘Mother’, ‘Child’)
child.father_method()
child.mother_method()
child.child_method()
代码块 1234
在第 1 行,创立实例 Child
在第 2 行,调用继承于父类 Father 的办法 father_method
在第 3 行,调用继承于父类 Mother 的办法 mother_method
在第 4 行,调用类本人的办法 child_method
程序输入后果如下:

father_attr = Father
mother_attr = Mother
child_attr = Child
代码块 123

欢送关注「慕课网」,发现更多 IT 圈优质内容,分享干货常识,帮忙你成为更好的程序员!

退出移动版