在 Python 中,继承(Inheritance)是 “面向对象编程(OOP)” 的三大特性之一,另外两个是封装和多态。继承允许我们定义一个基类(或称为父类),然后其他类(称为派生类或子类)可以继承这个基类,并获得基类的属性和方法。这极大地提高了代码的重用性。
Python 继承是什么?
在实际开发中,小伙伴们可能会碰到这样的情况:需要定义多个类,但是这些类之间有相当一部分的属性和方法都是相同的。也就是说,对于这些相同的属性和方法,我们在每个类中都要定义一遍。
在 Python 中,我们可以把这些相同的部分提取成一个父类,然后让这些子类去 “继承” 父类,这样就不用写那么多重复的代码了。比如有两个类:Teacher 和 Student,这两个类都有 “人” 的共同特征,我们可以把这两个类的共同部分提取出来,然后将其定义成一个 Person 类,之后再让 Teacher 和 Student 这两个类去继承这个 Person 类。
语法:
class 子类名 (父类名):
……说明:
想要让子类继承父类的属性和方法,只需要在类名后面加上一个 “()”,并且在 “()” 内写上 “父类名” 就可以了。这个有点类似于函数传参。
Python 继承示例
接下来,我们通过几个简单的例子来讲解 Python 继承是如何使用的。
示例 1:继承的基本用法
# 定义父类
class Person:
type = 'human'
def walk(self):
print('walking')
# 定义子类,并继承父类
class Student(Person):
def __init__(self, name, age):
self.name = name
self.age = age
def getname(self):
print(self.name)
# 实例化对象
s = Student('Jack', 18)
print(s.type)
s.walk()运行结果如下。
human
walking分析:
这个例子定义了两个类:Person 和 Student,然后让 Student 类继承 Person 类。s = Student('Jack', 18) 表示实例化一个 Student 对象,我们看到 s 可以调用父类的 type 属性和 walk() 方法。
当然了,我们也可以让多个类继承同一个父类,请看下面示例。
示例 2:多个类继承同一个父类
# 定义父类
class Person:
type = 'human'
def walk(self):
print('walking')
# 定义子类
class Student(Person):
def __init__(self, name, age):
self.name = name
self.age = age
def getname(self):
print(self.name)
# 定义子类
class Teacher(Person):
def __init__(self, name, course):
self.name = name
self.course = course
def getname(self):
print(self.name)
# Student 实例化
s = Student('Jack', 18)
print(s.type)
s.walk()
# Teacher 实例化
t = Teacher('Mr. Lincoln', 40)
print(t.type)
t.walk()运行结果如下。
human
walking
human
walking分析:
从结果可以看出,Student 和 Teacher 这两个类都继承了 Person 这个类,所以它们实例化出来的对象,都拥有 type 属性和 walk() 方法。
示例 3:使用 super() 调用父类构造函数
# 定义父类
class Person:
def __init__(self, name):
self.name = name
self.type = 'human'
def walk(self):
print('walking')
# 定义子类,并继承父类
class Student(Person):
def __init__(self, name, age):
# 使用 super() 调用父类的构造函数
super().__init__(name)
# 定义子类特有的属性
self.age = age
def get_info(self):
print(f'姓名:{self.name},年龄:{self.age},类型:{self.type}')
# 实例化对象
s = Student('Jack', 18)
s.get_info()运行结果如下。
姓名:Jack,年龄:18,类型:human分析:
在实际开发中,父类通常也有自己的 __init__() 方法。如果子类定义了自己的 __init__(),就会把父类的覆盖掉。为了既能保留父类的初始化逻辑,又能加上子类自己的逻辑,我们需要借助 super() 函数。
