python的继承
本章正式开始之前,先让我们回顾一下什么是 对象 ? 什么是 类 ?
小贝 喜欢 猫咪,今年领养了一只名叫 Kitty 的 布偶猫。则下列哪项是 对象 呢?
A. 猫咪 B. Kitty C. 布偶猫
相比之下,闻闻 更喜欢 犬科 动物,家里养了两只 萨摩耶犬,一只名叫 丁丁,另一只名叫 当当。则下列哪项是 类 呢?
A. 犬科 B. 萨摩耶犬 C. 丁丁 D. 当当
这两道题目中出现了 小贝 和 闻闻 这两位具体的人,提到了 Kitty、丁丁、当当 这三只具体的动物,他们都是 对象。这其中的人(Human)、猫咪(Cat)、布偶猫(Dagdoll)、萨摩耶(Samoyed)、犬科(Dog)几个 抽象概念 则是 类。

梳理清楚 类与对象 的关系后,我们能快速定义出这几个类,由类实例化出万千对象:
# 人类
class Human: pass
# 猫咪
class Cat: pass
# 布偶猫
class Dagdoll: pass
# 狗狗
class Dog: pass
# 萨摩耶犬
class Samoyed: passxiaobei = Human() # 小贝是人类
wenwen = Human() # 闻闻是人类
kitty = Dagdoll() # Kitty 是布偶猫
dingding = Samoyed() # 丁丁是萨摩耶犬
dangdang = Samoyed() # 当当是萨摩耶犬
拓展:上述
Human类、Cat类、Dagdoll类、Dog类和Samoyed类中都只包含一条pass语句,此时pass语句可以直接跟在class xxx:之后,写成一行。
假如我们使用 Python 内置函数 isinstance() 询问:“Kitty 是一只布偶猫吗?”Python 会回答“是”。就像这样:
print('Kitty 是一只布偶猫吗?')
print(isinstance(kitty, Dagdoll))
# 输出:
# Kitty 是一只布偶猫吗?
# True
isinstance() 函数接受两个参数,第一个参数为某个实例对象,第二个参数为某个类,能够检查第一个参数是否是第二个参数的 实例,并返回 True 或 False。因此上述代码第 2 行中的 isinstance(kitty, Dagdoll) 是在检查 kitty 实例对象是否是 Dagdoll 的实例。答案显然易见是 True。这也符合常识——Kitty 当然是一只布偶猫。
同样的道理,我们还可以检查丁丁、当当是否是萨摩耶犬。
⚠️⚠️⚠️ 重点 ⚠️⚠️⚠️
先定义 xiaobei = Human()
再询问
isinstance(xiaobei,Human)
可按照现实中的逻辑:我们知道 丁丁、当当是萨摩耶犬,又知道 萨摩耶犬是犬科动物,那么能顺理成章地推断出 丁丁、当当都是犬科动物。而如果我们询问 Python:“丁丁是一条狗吗?”此时 Python 却会回答“不是”。这就不太符合我们的预期了:
# 丁丁是一只萨摩耶犬
dingding = Samoyed()
print('丁丁是一只萨摩耶犬吗?')
print(isinstance(dingding, Samoyed))
print('丁丁是一只狗吗?')
print(isinstance(dingding, Dog))# 输出:
# 丁丁是一只萨摩耶犬吗?
# True
# 丁丁是一只狗吗?
# False
🤔️ 那我们该如何让 Python 知道 萨摩耶犬是犬科动物 这层关系呢?
这就是我们接下来要学习的重点内容——类的继承。
继承
继承的语法
“继承”这个词我们并不陌生。例如张三 继承 了祖宅,李四 继承 革命先烈遗志,继承 这个词的本意指的是后辈从先辈承受、接受了某种物质或精神,蕴含着一种 先与后、父与子的关系。放在计算机世界也一样,类的继承规定了类的父子关系。
假如我们已经定义了 Dog 类,想再定义一个它的 子类,名叫 Samoyed,那么可以写成这样:
# 狗狗
class Dog: pass# 萨摩耶犬
class Samoyed(Dog): pass
注意看代码第 5 行,老师定义 Samoyed 类时,在类名后添加了一对圆括号,并在圆括号内填入了 Dog 类的类名。这是在告诉 Python:“我接下来定义的 Samoyed 类 继承自 Dog 类,是它的 子类 哦。”
我们再检查一下“丁丁是否是狗”会发生什么呢?
# 狗狗
class Dog: pass# 萨摩耶犬
class Samoyed(Dog): pass# 丁丁是一只萨摩耶犬
dingding = Samoyed()
print('丁丁是一只狗吗?')
print(isinstance(dingding, Dog))# 输出:
# 丁丁是一只狗吗?
# True
😉 现在我们已经建立起 Samoyed 类和 Dog 类的关系,让 Python 明白 萨摩耶是犬科动物 啦!
并且,就像我们现实中的逻辑:假如我们只知道 丁丁是一只狗,那么是无法确定 丁丁是否是萨摩耶品种 的;所以,当我们由 Dog 类实例化出实例对象 dingding,再用 isinstance() 函数检查 dingding 是否是 Samoyed 类的实例,会发现 Python 坦诚地回答“不是”:
# 狗狗
class Dog: pass# 萨摩耶犬
class Samoyed(Dog): pass# 丁丁是一只狗
dingding = Dog()
print('丁丁是一只萨摩耶犬吗?')
print(isinstance(dingding, Samoyed))# 输出:
# 丁丁是一只萨摩耶犬吗?
# False
这就是 继承 的第一个好处。它能够让 Python 理解概念(类)与概念之间的范围关系(父类与子类)。
我们将刚刚定义的这些类放在一起,可以很清晰地观察到类与类之间的关系:
# 人类
class Human: pass# 猫咪
class Cat: pass
# 布偶猫
class Dagdoll(Cat): pass# 狗狗
class Dog: pass
# 萨摩耶犬
class Samoyed(Dog): pass
Dagdoll 类 继承 自 Cat 类,反过来说,Cat 类 派生 出了 Dagdoll 类。因此 Dagdoll 类是 Cat 类的子类,Cat 类是 Dagdoll 类的父类。
单选题
仿照上面的说法,我们知道:
Samoyed类 ① 自Dog类,反过来说,Dog类 ② 出了Samoyed类。A:① 继承;② 派生
B:① 派生;② 继承
当然这题是选A的,因为:
在这些叫法中,“父”与“子”是一对相对的概念,通常一起出现,比如 A 是 B 的父类,B 是 A 的子类;“继承”与“派生”也是一对相对的概念,也会一起出现,比如 A 继承自 B,B 派生出 A。如果脱离语境去说“A 是父类”是 没有意义 的,这点千万要注意啦。

继承 的第二个好处是,当我们约定 A 类继承自 B 类后,子类 A 将 自动获得 B 类中定义的 所有属性与方法。
子类调用父类方法
例如我们知道犬科动物有四条腿、能奔跑,开心的时候会摇尾巴,那么可以将 Dog 类扩充成如下形式:
# 狗狗
class Dog:# 犬科动物有四条腿leg_num = 4# 能奔跑def run(self):print('🐕💨 狗狗快跑')# 开心的时候会摇尾巴def happy(self):print('🐕💓 狗狗开心地摇起了尾巴')
此时我们再由 Dog 类派生出 Samoyed 类、Corgi 类(柯基犬),它们会自动地继承父类 Dog 中。因此由 Samoyed 类、Corgi 类实例化出的实例对象,可以调用 run() 方法奔跑,调用 happy() 方法快乐地摇尾巴:
# 萨摩耶犬
class Samoyed(Dog): pass# 柯基犬
class Corgi(Dog): pass# 丁丁是一只萨摩耶犬
dingding = Samoyed()
print('丁丁:', end = '') # 输出“丁丁:”后不换行
# 丁丁能奔跑
dingding.run()# 小可是一只柯基犬
xiaoke = Corgi()
print('小可:', end = '')
# 小可在快乐地摇尾巴
xiaoke.happy()# 输出:
# 丁丁:🐕💨 狗狗快跑
# 小可:🐕💓 狗狗开心地摇起了尾巴
Python 在执行到 dingding.run() 时,会先检查 dingding 自身类型 Samoyed 中有没有 run() 方法,发现没有,再去 Samoyed 的父类 Dog 中寻找 run() 方法。这时它找到了 run() 方法,知道自己需要输出一行字,便把“🐕💨 狗狗快跑”打印到了屏幕上:

🤔️ 既然 Python 会先检查自身类型中有没有对应方法,那如果我们在 Dog 的子类 Samoyed 中 重新编写 run() 方法后再调用 dingding.run(),比如:
# 萨摩耶犬
class Samoyed(Dog):# 重新编写父类中定义的 run() 方法def run(self):# 该方法会输出 🐕💨 萨摩耶狂奔!print('🐕💨 萨摩耶狂奔!')# 丁丁是一只萨摩耶犬
dingding = Samoyed()
print('丁丁:', end = '')
# 丁丁在奔跑
dingding.run()
请你按照要求和注释中的提示,定义 Samoyed 类,并实例化出 dingding 实例对象,让 dingding 调用 run() 方法,观察运行结果。
要求
Samoyed类继承自Dog类;- 在
Samoyed类中编写run()方法,该方法会输出 🐕💨 萨摩耶狂奔!。
# 狗狗
class Dog:# 犬科动物有四条腿leg_num = 4# 能奔跑def run(self):print('🐕💨 狗狗快跑')# 开心的时候会摇尾巴def happy(self):print('🐕💓 狗狗开心地摇起了尾巴')# 请在下方定义 Samoyed 类
class Samoyed(Dog):# 请在重新编写父类中定义的 run() 方法def run(self):# 该方法会输出 🐕💨 萨摩耶狂奔!print('萨摩耶狂奔🐕💨')# 实例化 Samoyed 类,将生成的实例对象赋值给 dingding
dingding = Samoyed()
print('丁丁:', end = '')
# dingding 调用 run() 方法
dingding.run()# 输出
# 丁丁:萨摩耶狂奔🐕💨
由此可以得出:
Python 运行到 dingding.run() 时,它依然会先到自身类型 Samoyed 中寻找。这时它发现,Samoyed 类中有一个名叫 run() 的方法,于是会直接执行该方法,最终在屏幕上打印出“🐕💨 萨摩耶狂奔!”。

Dog 类与它派生出的子类 Samoyed 中 都有名叫 run() 的方法,但 Dog 类中的方法会打印“🐕💨 狗狗快跑”,Samoyed 类中的方法则会打印“🐕💨 萨摩耶狂奔!”。两个方法虽然名字相同,实际完成的任务却不相同。这种现象被称为 多态。
下一章:python的 多态
相关文章:
python的继承
本章正式开始之前,先让我们回顾一下什么是 对象 ? 什么是 类 ? 小贝 喜欢 猫咪,今年领养了一只名叫 Kitty 的 布偶猫。则下列哪项是 对象 呢? A. 猫咪 B. Kitty C. 布偶猫 相比之下,闻闻 更喜欢 犬科 动…...
组件的注册和引用
在Vue中,开发者可以将页面中独立的、可重用的部分封装成组件,对组件的结构,样式和行为进行设置。组件是 Vue 的基本结构单元,组件之间可以相互引用。 一.注册组件 当在Vue项目中定义了一个新的组件后,要想在其他组件中…...
诊所如何赢得患者?做好这两点很关键!
大家都知道,社区周边的诊所原本是居民看病的第一选择,方便又快捷。但现在很多诊所服务都差不多,没有自己的特色,这就让患者有点难选择了。那诊所怎么做才能更吸引患者呢?其实,关键是要抓住患者的心…...
Qwen2本地部署的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
html+CSS+js部分基础运用15
1、完成输入框内容的实时反向输出。 2、银行账户余额变动自动通知项目。 设计要求:单击按钮后,余额按照输入框的数额减少,同时将按钮式的提示信息(金额)同步改变。利用侦听属性实现余额发生变化时发出提示信息&#x…...
从零开始学JAVA
一、编写Hello world程序 public class JavaMain1 {//主程序执行入口,main方法public static void main(String[] args){System.out.println("Hello world!");} } 运行结果 Hello world! java编写主程序常见错误: 1、System ---首字母没有…...
MySQL(四)查询
1、MySQL限性约束 —非空、唯一(自增)、主外键、检查(MySQL存在但是不能用)。 约束主要完成对数据的校验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 1)常用五类约束 not null :非空约束,指定某列不为空。 unique:唯一约束,指定某列和几列组…...
嵌入式学习——网络编程(TCP)——day31
1. TCP和UDP的区别 TCP(Transmission Control Protocol,传输控制协议) UDP(User Datagram Protocol,用户数据报协议) 1.1 连接方式 TCP 是面向连接的协议,它在数据传输前需要通过三次握手建立…...
[STM32]定位器与PWM的LED控制
目录 1. 深入了解STM32定时器原理,掌握脉宽调制pwm生成方法。 (1)STM32定时器原理 原理概述 STM32定时器的常见模式 使用步骤 (2)脉宽调制pwm生成方法。 2. 实验 (1)LED亮灭 代码 测试效果 (2)呼吸灯 代码 测试效果 3.总结 1. 深入了解STM32定时器原…...
可视化数据科学平台在信贷领域应用系列五:零代码可视化建模
信贷风控模型是金融机构风险管理的核心工具,在信贷风险管理工作中扮演着至关重要的角色。随着信贷市场的环境不断变化,信贷业务的风险日趋复杂化和隐蔽化,开发和应用准确高效的信贷风控模型显得尤为重要。信贷风险控制面临着越来越大的挑战和…...
Windows 11广告植入“另辟蹊径”:PC Manager暗示若不使用必应搜索,你的系统可能需要“修复”
Edge浏览器近期增添了许多实用的新功能,如侧边栏、休眠标签页和沉浸式阅读器。话虽如此,浏览器中仍有一部分功能被部分用户视为“冗余软件”和不必要的累赘。 随着Windows 11用户逐渐习惯操作系统关键位置出现越来越多的广告,微软似乎正尝试以…...
一线教师教学工具汇总
亲爱的教师们!我们的教学工具箱里也该更新换代啦!今天,就让我来给大家安利一波超实用的教学神器: 百度文库小程序 —— 在线图书馆 百度文库,一个宝藏级的在线文档分享平台!在这里,你可以找到海…...
【数据结构】栈和队列-->理解和实现(赋源码)
Toc 欢迎光临我的Blog,喜欢就点歌关注吧♥ 前面介绍了顺序表、单链表、双向循环链表,基本上已经结束了链表的讲解,今天谈一下栈、队列。可以简单的说是前面学习的一特殊化实现,但是总体是相似的。 前言 栈是一种特殊的线性表&…...
一篇教会你CSS定位
前言:在网页布局的时候,我们需要将想要的元素放到指定的位置上,这个时候我们就可以使用CSS中的定位操作。 先让我们看一下本篇文章的大致内容: 目录 什么是定位 1.相对定位 2.绝对定位 3. 固定定位 4. 粘性定位 5. 定位层级…...
Hive的常规操作
Hive常规操作 hive常用交互命令 -e执行sql语句 [rootmaster ~]# hive -e "show databases";-f执行sql脚本 [rootmaster ~]# hive -f /usr/local/demo.sql查看hive中输入的所有命令 [rootmaster ~]# cat ~/.hivehistory操作库 创建库 语法: create…...
redis做为缓存,mysql的数据如何与redis进行同步呢?
让我们一步步来实现如何让MySQL数据库的数据和Redis缓存保持同步。想象一下,MySQL是一个大仓库,存放着所有重要的货物(数据),而Redis则像是一个快速取货窗口,让你能更快拿到常用的东西。为了让两者保持一致…...
【Map】集合总结
一、Map 之前学习的Collection集合体系是单列集合,即一次存取一个元素 Map是双列集合,一次存取一对元素,这一对儿称为键值对,key-value,且key是映射到value 所谓键映射到值,是指只能通过键找到值,无法通过值找键 Map中键不能重复!值允许重复 Map中一个键,只能对应一个值 Ma…...
SpringBoot实现发送邮件功能
目录 一、开启邮件服务 二、导入pom依赖 三、配置yml文件 四、发送邮件 4.1、发送文字邮件 4.2、发送html邮件 4.3、发送附件邮件 4.4、发送图片邮件 一、开启邮件服务 这里拿QQ邮箱举例。 翻到下面进行开启,之后获取授权码。 二、导入pom依赖 <dependency><…...
外观数列 ---- 模拟
题目链接 题目: 分析: 题目的意思如下:所以我们需要引用双指针来找到连续的字符有几个, 并添加到答案中, 接着将此字符添加到答案中, 让left right , 继续向后遍历整个字符串, 重复上面的操作将答案重新赋给字符串, 继续重复上述操作, 应该重复n - 1 次, 因为n为1的时候, 直…...
上心师傅的思路分享(二)
Druid monitor 与Springboot常见报错界面渗透小技巧 目录 前言 1.Druid monitor介绍 2.Druid未授权(1rank) 3.druid弱口令 4.Druid进一步利用 4.1 URL监控 4.2 Session监控 利用思路 EditThisCookie(小饼干插件) 5.SpringBoot Actuator未授权访问漏洞 5.1 简介 5…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...
