Python中类的继承细讲
创始人
2025-05-28 13:25:52
0

文章目录

  • 前言
  • 一、继承的基本语法
  • 二、方法重写
  • 三、派生类中调用基类的 _ _init _ _() 方法


前言

  在编写类时,并不是每次都要从空白开始。当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率。下面将介绍如何在 Python 中实现继承


一、继承的基本语法

  继承面向对象编程最重要的特性之一,它源于人们认识客观世界的过程,是自然界普遍存在的一种现象。例如,我们每一个人都从祖辈和父母那里继承了一些体貌特征,但是每个人却又不同于父母,因为每个人都存在自己的一些特性,这些特性是独有的,在父母身上并没有提现。在程序设计中实现继承,表示这个类拥有它继承的类的所有公有成员或者受保护成员。在面向对象编程中,被继承的类称为父类或基类新的类称为子类或者派生类
  通过继承不仅可以实现代码的重用,还可以通过继承来理顺类与类之间的关系。在 Python 中,可以在类定义语句中,类名右侧使用一对小括号将要继承的基类名称括起来,从而实现类的继承。具体的语法格式如下:

class ClassName(baseclasslist): '''类的帮助信息'''  # 类文档字符串statement  # 类体

参数说明

  • ClassName:用于指定类名。
  • baseclasslist:用于指定要继承的基类,可以有多个,类名之间用逗号 “,” 分隔。如果不指定,将使用所有 Python 对象的基类 object
  • ‘’‘类的帮助信息’‘’:用于指定类的文档字符串,定义该字符串后,在创建类的对象时,输入类名和左侧的括号 “(” 后,将显示该信息。
  • statement:类体,主要由类变量(或类成员)、方法和属性等定义语句组成。如果在定义类时,没想好类的具体功能,也可以在类体中直接使用 pass 语句代替。

  例如,定义一个水果类 Fruit(作为基类),并在该类中定义一个类属性(用于保存水果默认的颜色)和一个 harvest() 方法,然后创建 Banana 类和 Grape 类,都继承自 Fruit 类,最后创建 Banana 类和 Grape 类的实例,并调用 harvest() 方法(在基类中编写),代码如下:

class Fruit:  # 定义水果类(基类)color = '绿色'  # 定义类属性def harvest(self, color):print('水果是{}的'.format(color))  # 输出的是形式参数colorprint('水果已经收获......')print('水果原来是{}的'.format(Fruit.color))  # 输出的是类属性color
class Banana(Fruit):  # 定义香蕉类(派生类)color = '黄色'def __init__(self):print('我是香蕉')
class Grape(Fruit):  # 定义葡萄类(派生类)color = '紫色'def __init__(self):print('我是葡萄')
banana = Banana()  # 创建类的实例(香蕉)
banana.harvest(banana.color)  # 调用基类的harvest()方法
grape = Grape()  # 创建类的实例(葡萄)
grape.harvest(grape.color)  # 调用基类的harvest()方法

  执行上面代码,将显示如下图所示结果:

在这里插入图片描述

  从运行结果中可以看出,虽然在 Banana 类和 Grape 类中没有 harvest() 方法,但是 Python 允许派生类访问基类的方法


二、方法重写

  基类的成员都会被派生类继承,当基类中的某个方法不完全适用于派生类时,就需要在派生类中重写父类的这个方法。
  在上面的实例代码中,基类里面定义的 harvest() 方法,无论派生类是什么水果都显示 “水果…”,而没有将水果的名字显示上去,如下图所示:

在这里插入图片描述

  如果想要针对不同水果给出不同的提示,可以在派生类中重写 harvest() 方法。代码如下:

class Fruit:  # 定义水果类(基类)color = '绿色'  # 定义类属性def harvest(self, color):print('水果是{}的'.format(color))  # 输出的是形式参数colorprint('水果已经收获......')print('水果原来是{}的'.format(Fruit.color))  # 输出的是类属性color
class Banana(Fruit):  # 定义香蕉类(派生类)color = '黄色'def __init__(self):print('我是香蕉')def harvest(self, color):print('香蕉是{}的'.format(color))  # 输出的是形式参数colorprint('香蕉已经收获......')print('香蕉原来是{}的'.format(Fruit.color))  # 输出的是类属性color
banana = Banana()  # 创建类的实例(香蕉)
banana.harvest(banana.color)  # 调用基类的harvest()方法

  运行上面代码后,结果显示如下:

我是香蕉
香蕉是黄色的
香蕉已经收获......
香蕉原来是绿色的

三、派生类中调用基类的 _ _init _ _() 方法

  在派生类中定义 _ _ init _ _() 方法时,不会自动调用基类的 _ _ init _ _() 方法。例如,定义一个 Fruit 类,在 _ _ init _ _() 方法中创建类属性 color,然后在 Fruit 类中定义一个 harvest() 方法,在该方法中输出类属性 color 的值,再创建继承自 Fruit 类的 Banana 类,最后创建 Banana 类的实例,并调用 harvest() 方法,代码如下:

class Fruit:  # 定义水果类(基类)def __init__(self, color = '绿色'):Fruit.color = color  # 定义类属性def harvest(self):print('水果原来是{}的'.format(Fruit.color))  # 输出的是类属性color
class Banana(Fruit):  # 定义香蕉类(派生类)def __init__(self):print('我是香蕉')
banana = Banana()  # 创建类的实例(香蕉)
banana.harvest()  # 调用基类的harvest()方法

  执行上面代码后,将显示如下图所示的异常信息。

在这里插入图片描述

  因此,要让派生类调用基类的 _ _ init _ _() 方法进行必要的初始化,需要在派生类使用 super() 函数调用基类的 _ _ init _ _() 方法,用法格式如下:

super()._ _init_ _([参数1, ....])

注意:如果基类的初始化方法中有参数传入,则这里需要在 _ _init_ _() 括号中写入形式参数

  在上面代码中加入 super()._ _ init _ _() 之后,代码及运行结果如下图所示:

在这里插入图片描述

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...