Docker 持久化存储和数据共享_Volume
有些容器会自动产生一些数据,为了不让数据随着 container 的消失而消失,保证数据的安全性。例如:数据库容器,数据表的表会产生一些数据,如果我把 container 给删除,数据就丢失。为了保证数据不丢失,这就有了 Volume 的存在。
Volume 是保存 Docker 容器生成和使用的数据的首选机制。虽然 bind mounts 依赖于主机的目录结构,但 Volume 完全由 Docker 管理。Volume 绑定安装有几个优点:
- 与 bind mounts 入相比,Volume 更易于备份或迁移。
- 您可以使用 Docker CLI 命令或 Docker API 管理 Volume。
- Volume 适用于 Linux 和 Windows 容器。
- 可以在多个容器之间更安全地共享 Volume。
- Volume 驱动程序允许您在远程主机或云提供程序上存储 Volume,加密 Volume 的内容或添加其他功能。
- 新 Volume 可以通过容器预先填充其内容。
此外,Volume 通常是比容器的可写层中的持久数据更好的选择,因为 Volume 不会增加使用它的容器的大小,并且 Volume 的内容存在于给定容器的生命周期之外。
Data Volume 结构图
如果容器生成非持久状态数据,请考虑使用 tmpfs 挂载以避免将数据永久存储在任何位置,并通过避免写入容器的可写层来提高容器的性能。
Volume 使用 rprivate
绑定传播,并且 Volume 不可配置绑定传播。
选择 - v 或 --mount 标志
最初,-v
或者 --volume
标志用于独立容器,--mount
标志用于群集服务。但是,从 Docker 17.06 开始,您还可以使用 --mount
独立容器。一般来说, --mount
更明确和冗长。最大的区别在于 -v
语法将所有选项组合在一个字段中,而 --mount
语法将它们分开。以下是每个标志的语法比较。
新用户应该尝试 --mount 比 --volume 语法更简单的语法。
如果需要指定 Volume 选项,则必须使用 --mount
。
-v
或--volume
:由三个字段组成,用冒号字符(:
)分隔。字段必须按正确的顺序排列,并且每个字段的含义不是很明显。- 对于命名卷,第一个字段是 Volume 的名称,并且在给定主机上是唯一的。对于 anonymous volumes,省略第一个字段。
- 第二个字段是文件或目录在容器中安装的路径。
- 第三个字段是可选的,是逗号分隔的选项列表,例如
ro
。这些选项将在下面讨论。
--mount
:由多个键值对组成,以逗号分隔,每个键<key>=<value>
组由一个元组组成。该--mount
语法比更详细的-v
或--volume
,但按键的顺序并不显著,并且标志的价值更容易理解。type
安装件,其可以是 bind,volume
,或 tmpfs。本主题讨论 volumes,因此类型始终是volume
。source
安装的。对于命名卷,这是 volume 的名称。对于 anonymous volumes,省略此字段。可以指定为source
或src
。destination
文件或目录安装在容器中的路径作为其值。可以指定为destination
,dst
或target
。readonly
选项(如果存在)导致绑定装入以只读方式装入容器中。volume-opt
选项可以多次指定,它采用由选项名称及其值组成的键值对。转义外部 CSV 解析器的值
如果您的 volume 驱动程序接受以逗号分隔的列表作为选项,则必须从外部 CSV 解析器中转义该值。要转义 a
volume-opt
,用双引号括起来("
)并用单引号括起整个 mount 参数('
)。例如,
local
驱动程序接受 mount 选项作为o
参数中以逗号分隔的列表。此示例显示了转义列表的正确方法。$ docker service create \--mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'--name myservice \<IMAGE>
下面的示例显示了可能的语法 --mount
和 -v
语法,并 --mount
首先给出。
-v
和 --mount
行为之间的差异
与 bind mounts 相反,anonymous volumes 的所有选项都可用于 标记 --mount
和 -v
标记。
使用具有服务的 anonymous volumes 时,仅 --mount
支持。
创建和管理 volume
与 bind mounts 不同,您可以创建和管理任何容器范围之外的 volume。
Create a volume:
$ docker volume create my-vol
List volumes:
$ docker volume ls local my-vol
Inspect a volume:
$ docker volume inspect my-vol
[{"Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/my-vol/_data","Name": "my-vol","Options": {},"Scope": "local"}
]
Remove a volume:
$ docker volume rm my-vol
启动具有 volume 的容器
如果启动具有尚不存在 volume 的容器,Docker 会为您创建 volume。以下示例将 volume myvol2
装入 /app/
容器中。
所述 -v
和 --mount
以下实施例产生相同的结果。除非在运行第一个 devtest
容器和 myvol2
volume 之后删除容器和 volume,否则不能同时运行它们。
--mount
$ docker run -d \--name devtest \--mount source=myvol2,target=/app \nginx:latest
-v
$ docker run -d \--name devtest \-v myvol2:/app \nginx:latest
使用 docker inspect devtest
验证创建 volume 并安装正确。寻找 Mounts
部分:
"Mounts": [{"Type": "volume","Name": "myvol2","Source": "/var/lib/docker/volumes/myvol2/_data","Destination": "/app","Driver": "local","Mode": "","RW": true,"Propagation": ""}
],
这表明 mount 是一个 volume,它显示正确的源和目标,并且 mount 是可读写的。
停止容器并移除 volume。注意删除 volume 是一个单独的步骤。
$ docker container stop devtest$ docker container rm devtest$ docker volume rm myvol2
使用 volume 启动服务
启动服务并定义 volume 时,每个服务容器都使用自己的本地 volume。如果使用 local
volume 驱动程序,则所有容器都不能共享此数据,但某些 volume 驱动程序确实支持共享存储。Docker for AWS 和 Docker for Azure 都使用 Cloudstor 插件支持持久存储。
以下示例启动 nginx
具有四个副本的服务,每个副本使用一个名为的本地 volume myvol2
。
$ docker service create -d \--replicas=4 \--name devtest-service \--mount source=myvol2,target=/app \nginx:latest
使用 docker service ps devtest-service
验证服务正在运行:
$ docker service ps devtest-serviceID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
4d7oz1j85wwn devtest-service.1 nginx:latest moby Running Running 14 seconds ago
删除服务,停止其所有任务:
$ docker service rm devtest-service
删除服务不会删除该服务创建的任何 volume。Volume removal 是一个单独的步骤。
服务的语法差异
该 docker service create
命令不支持 -v
或 --volume
标志。将 volume 安装到服务的容器中时,必须使用该 --mount
标志。
使用容器填充 volume
如果启动一个创建新 volume 的容器(如上所述),并且容器在要挂载的目录中具有文件或目录(/app/
如上所述),则将目录的内容复制到 volume 中。然后容器安装并使用该 volume,而使用该 volume 的其他容器也可以访问预先填充的内容。
为了说明这一点,此示例启动一个 nginx
容器,并 nginx-vol
使用容器 /usr/share/nginx/html
目录的内容填充新 volume,这是 Nginx 存储其默认 HTML 内容的位置。
这些 --mount
和 -v
示例具有相同的最终结果。
--mount
$ docker run -d \--name=nginxtest \--mount source=nginx-vol,destination=/usr/share/nginx/html \nginx:latest
-v
$ docker run -d \--name=nginxtest \-v nginx-vol:/usr/share/nginx/html \nginx:latest
运行这些示例之一后,运行以下命令以清理容器和 volume。注意删除 volume 是一个单独的步骤。
$ docker container stop nginxtest$ docker container rm nginxtest$ docker volume rm nginx-vol
使用只读 volume
对于某些开发应用程序,容器需要写入绑定装入,以便将更改传播回 Docker 主机。在其他时候,容器只需要对数据的读访问权。请记住,多个容器可以安装相同的 volume,并且可以为其中一些容器以读写方式挂载,同时为其他容器以只读方式挂载。
此示例修改上面的一个,但通过 ro
在容器中的挂载点之后添加(默认为空)选项列表,将目录挂载为只读 volume. 如果存在多个选项,请用逗号分隔。
这些 --mount
和 -v
示例具有相同的结果。
--mount
$ docker run -d \--name=nginxtest \--mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \nginx:latest
-v
$ docker run -d \--name=nginxtest \-v nginx-vol:/usr/share/nginx/html:ro \nginx:latest
使用 docker inspect nginxtest
验证绑定安装正确创建。寻找 Mounts
部分:
"Mounts": [{"Type": "volume","Name": "nginx-vol","Source": "/var/lib/docker/volumes/nginx-vol/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "","RW": false,"Propagation": ""}
],
停止并取出容器,然后取出 volume。去除 volume 是一个单独的步骤。
$ docker container stop nginxtest$ docker container rm nginxtest$ docker volume rm nginx-vol
在机器之间共享数据
构建容错应用程序时,可能需要配置同一服务的多个副本才能访问相同的文件。
在开发应用程序时,有几种方法可以实现此目的。一种是为应用程序添加逻辑,以将文件存储在 Amazon S3 等云对象存储系统上。另一种方法是使用支持将文件写入 NFS 或 Amazon S3 等外部存储系统的驱动程序创建 volume。
volume 驱动程序允许您从应用程序逻辑中抽象底层存储系统。例如,如果您的服务使用具有 NFS 驱动程序的 volume,则可以更新服务以使用其他驱动程序,例如在云中存储数据,而无需更改应用程序逻辑。
使用音量驱动程序
使用创建 volume 时 docker volume create
,或者启动使用尚未创建的 volume 的容器时,可以指定 volume 驱动程序。以下示例使用 vieux/sshfs
volume 驱动程序,首先在创建独立 volume 时使用,然后在启动创建新 volume 的容器时使用。
初始设置
此示例假定您有两个节点,第一个节点是 Docker 主机,可以使用 SSH 连接到第二个节点。
在 Docker 主机上,安装 vieux/sshfs
插件:
$ docker plugin install --grant-all-permissions vieux/sshfs
使用卷驱动程序创建 volume
此示例指定 SSH 密码,但如果两台主机配置了共享密钥,则可以省略密码。每个卷驱动程序可以具有零个或多个可配置选项,每个选项都使用 -o
标志指定。
$ docker volume create --driver vieux/sshfs \-o sshcmd=test@node2:/home/test \-o password=testpassword \sshvolume
启动使用 volume 驱动程序创建 volume 的容器
此示例指定 SSH 密码,但如果两台主机配置了共享密钥,则可以省略密码。每个 volume 驱动程序可以具有零个或多个可配置选项。如果 volume 驱动程序要求您传递选项,则必须使用该 --mount
标志来装入 volume,而不是 -v
。
$ docker run -d \--name sshfs-container \--volume-driver vieux/sshfs \--mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \nginx:latest
备份,还原或迁移数据 volume
volume 对备份,还原和迁移很有用。使用该 --volumes-from
标志创建一个安装该 volume 的新容器。
备份容器
例如,在下一个命令中,我们:
- 启动新容器并从
dbstore
容器装入 volume - 挂载本地主机目录为
/backup
- 将
dbdata
volume 内容的命令传递给目录中的backup.tar
文件/backup
。
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
当命令完成并且容器停止时,我们将留下我们 dbdata
volume 的备份。
从备份还原容器
使用刚刚创建的备份,您可以将其还原到同一容器或您在其他位置创建的另一个容器。
例如,创建一个名为的新容器 dbstore2
:
$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
然后解压缩新容器的数据 volume 中的备份文件:
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
您可以使用上述技术使用首选工具自动执行备份,迁移和还原测试。
删除 volume
删除容器后,Docker 数据卷仍然存在。要考虑两种类型的 volume:
- 例如,命名 volume 在容器外部具有特定的源表单
awesome:/bar
。 - 匿名 volume 没有特定的源,因此在删除容器时,指示 Docker Engine 守护程序删除它们。
删除匿名 volume
要自动删除匿名 volume,请使用该 --rm
选项。例如,此命令创建匿名 /foo
volume。移除容器后,Docker Engine 会删除 /foo
volume 但不会删除 awesome
volume。
$ docker run --rm -v /foo -v awesome:/bar busybox top
删除所有 volume
要删除所有未使用的 volume 并释放空间:
$ docker volume prune
例子:
以官方镜像 mysql 的 dockerfile 文件为例 。其中 dockerfile 通过 volume 指定了当前容器中要备份的文件路径,但是并没有指定说要保存到宿主机的哪个位置。
volume: 映射容器中的文件到本地宿主机硬盘中
在我们使用 docker run
启动 mysql 镜像容器的时候,容器会默认在宿主机生成一个 volume,至于位置在哪,名字是什么,可以通过如下命令查看
#查看所有
volumedocker volume ls
#删除指定
volumedocker volume rm [volume name]
#查看volume详细
docker volume inspect [volume name]
此时我们删除容器,发现 volume 数据卷还在,有保留。
此时我们会觉得这个 data volume name 的名字很长,很不好理解。我们可以通过 -v
如下命令来指定生成的 volume name docker run -d -v mysql:/var/lib/mysql --name mysql mysql5.7
-v
: 前参数是 volume name, : 后面的是要备份的文件目录 (容器)
此时我们删除容器,volume 数据卷还在,我们用这个名为 mysql 的 volume 作为一个新容器的数据卷,覆盖它。
docker run -d -v mysql:/var/lib/mysql --name mysql2 mysql5.7
进入 mysql2 容器中,mysql -uroot 进入数据库中,发现当前数据库数据和之前删除的容器中的数据库数据一样。
相关文章:

Docker 持久化存储和数据共享_Volume
有些容器会自动产生一些数据,为了不让数据随着 container 的消失而消失,保证数据的安全性。例如:数据库容器,数据表的表会产生一些数据,如果我把 container 给删除,数据就丢失。为了保证数据不丢失…...

万宾科技智能井盖监测仪器助力建设数字化城市
市政公共设施建设在近几年来发展迅速,市政设备的更新换代,资产管理等也成为其中的重要一项。在市政设施建设过程中,井盖也是不可忽视的,一方面,根据传统的管理井盖模式来讲,缺乏有效的远程监控管理方法和手…...

第十一章《搞懂算法:聚类是怎么回事》笔记
聚类是机器学习中一种重要的无监督算法,可以将数据点归结为一系列的特定组合。归为一类的数据点具有相同的特性,而不同类别的数据点则具有各不相同的属性。 11.1 聚类算法介绍 人们将物理或抽象对象的集合分成由类似 的对象组成的多个类的过程被称为聚…...

给定n个点或一个凸边形,求其最小外接矩形,可视化
这里写目录标题 原理代码 原理 求n个点的最小外接矩形问题可以等价为先求这n个点的凸包,再求这个凸包的最小外接矩形。 其中求凸包可以使用Graham-Scan算法 需要注意的是, 因为Graham-Scan算法要求我们从先找到凸包上的一个点,所以我们可以先…...

蓝桥杯每日一题2023.11.6
取位数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由题意我们知道len中为现阶段长度,如果其与k相等也就是找到了正确的位数,否则就调用递归来进行搜索,每次搜索一位数。 #include <stdio.h> // 求x用10进制表示时的数位长度 int …...

V-REP和Python的联合仿真
机器人仿真软件 各类免费的的机器人仿真软件优缺点汇总_robot 仿真 软件收费么_dyannacon的博客-CSDN博客 课程地址 https://class.guyuehome.com/p/t_pc/course_pc_detail/column/p_605af87be4b007b4183a42e7 课程资料 guyueclass: 古月学院课程代码 旋转变换 旋转的左乘与…...

WPF布局控件之DockPanel布局
前言:博主文章仅用于学习、研究和交流目的,不足和错误之处在所难免,希望大家能够批评指出,博主核实后马上更改。 概述: DockPanel 位置子控件基于子 Dock 属性,你有 4 个选项停靠,左 (默认) &…...

【实战Flask API项目指南】之二 Flask基础知识
实战Flask API项目指南之 Flask基础知识 本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧! 前言 当小菜踏入Flask后端开发的世界&…...

Linux 编译链接那些事儿(02)C++链接库std::__cxx11::basic_string和std::__1::basic_string链接问题总结
1 问题背景说明 在自己的项目源码中引用libeasysqlite.so时编译成功,但运行时遇到问题直接报错,找不到符号 symbol:_ZN3sql5FieldC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_10field_typeEi。 2 问题描述和解…...

按键精灵中的UI界面操作
1. 按键精灵中UI界面常用的控件 1. 文字框 界面1: {标签页1:{文字框:{名称:"文字框1",显示内容:"显示内容",文字大小:0,高度:0,宽度:0,注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性&qu…...

dpdk 程序如何配置网卡收发包队列描述符配置?
问题描述 dpdk 程序在配置网卡队列时会涉及收发包队列描述符数量配置问题,收发包描述符的数量看似是一个简单的配置,却对转发性能有着一定的影响。实际业务程序中,收发包描述符大小配置一般参考 dpdk 内部示例程序配置进行,经验之…...

二蛋赠书七期:《云原生数据中台:架构、方法论与实践》
前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直…...

计算机毕设 基于大数据的服务器数据分析与可视化系统 -python 可视化 大数据
文章目录 0 前言1 课题背景2 实现效果3 数据收集分析过程**总体框架图****kafka 创建日志主题****flume 收集日志写到 kafka****python 读取 kafka 实时处理****数据分析可视化** 4 Flask框架5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升&a…...

初识rust
调试下rust 的执行流程 参考: 认识 Cargo - Rust语言圣经(Rust Course) 新建一个hello world 程序: fn main() {println!("Hello, world!"); }用IDA 打开exe,并加载符号: 根据字符串找到主程序入口: 双击…...

shiro-cve2016-4437漏洞复现
一、漏洞特征 Apache Shiro是一款开源强大且易用的Java安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。 因为在反序列化时,不会对其进行过滤,所以如果传入恶意代码将会造成安全问题 在 1.2.4 版本前, 加…...

【MongoDB-Redis-MySQL-Elasticsearch-Kibana-RabbitMQ-MinIO】Java全栈开发软件一网打尽
“Java全栈开发一网打尽:在Windows环境下探索技术世界的奇妙之旅” 前言 全栈开发是一项复杂而令人兴奋的任务,涵盖了从前端到后端、数据库到可视化层、消息队列到文件存储的广泛领域。本文将带您深入探讨在Windows环境下进行全栈开发的过程࿰…...

Implementing class错误解决
最近在使用IDEASmart Tomcat启动项目时,报以下错误: Injection of resource dependencies failed; nested exception is java.lang.IncompatibleClassChangeError: Implementing class根据网上结论加上我这里的原因,总共以下几个方面&#x…...

关于 国产系统UOS系统Qt开发Tcp服务器外部连接无法连接上USO系统 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134254817 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…...

初阶JavaEE(15)(Cookie 和 Session、理解会话机制 (Session)、实现用户登录网页、上传文件网页、常用的代码片段)
接上次博客:初阶JavaEE(14)表白墙程序-CSDN博客 Cookie 和 Session 你还记得我们之前提到的Cookie吗? Cookie是HTTP请求header中的一个属性,是一种用于在浏览器和服务器之间持久存储数据的机制,允许网站…...

C++入门学习(1)命名空间和输入输出
前言 在C语言和基本的数据结构学习之后,我们终于迎来了期待已久的C啦!C发明出来的意义就是填补一些C语言的不足,让我们更加方便的写代码,所以今天我们就来讲一下C语言不足的地方和在C中的解决办法! 一、命名空间 在学习…...

AI:58-基于深度学习的猫狗图像识别
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

【原创】java+swing+mysql宠物领养管理系统设计与实现
摘要: 生活中,有很多被人遗弃的宠物,这些宠物的处理成为了一个新的难题。生活中也有许多人喜欢养宠物,为了方便大家进行宠物领养,提高宠物领养管理的效率和便利性。本文针对这一问题,提出设计和实现一个基…...

虚拟机Linux-Centos系统网络配置常用命令+Docker 的常用命令
目录 1、虚拟机Linux-Centos系统网络配置常用命令2、Docker 的常用命令2.1 安装docker步骤命令2.2 在docker容器中安装和运行mysql 2、dockerfile关键字区别(ADD/COPY,CMD/ENTRYPOINT) 1、虚拟机Linux-Centos系统网络配置常用命令 进入网络配置文件目录 cd /etc/sysconfig/ne…...

数据分析相关知识整理_--秋招面试版
一、关于sql语句(常问) 1)sql写过的复杂的运算 聚合函数,case when then end语句进行条件运算,字符串的截取、替换,日期的运算,排名等等;行列转换; eg:行列转换 SELE…...

HMM与LTP词性标注之命名实体识别与HMM
文章目录 知识图谱介绍NLP应用场景知识图谱(Neo4j演示)命名实体识别模型架构讲解HMM与CRFHMM五大要素(两大状态与三大概率)HMM案例分享HMM实体识别应用场景代码实现 知识图谱介绍 NLP应用场景 图谱的本质,就是把自然…...

Sui发布RPC2.0 Beta,拥抱GraphQL并计划弃用JSON-RPC
为了解决现有RPC存在的许多已知问题,Sui正在准备推出一个基于GraphQL的新RPC服务,名为Sui RPC 2.0。GraphQL是一种开源数据查询和操作语言,旨在简化需要复杂数据查询的API和服务。 用户目前可以访问Sui主网和测试网网络的Beta版本的只读快照…...

设计模式—结构型模式之桥接模式
设计模式—结构型模式之桥接模式 将抽象与实现解耦,使两者都可以独立变化。 在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不…...

【RabbitMQ】RabbitMQ 消息的堆积问题 —— 使用惰性队列解决消息的堆积问题
文章目录 一、消息的堆积问题1.1 什么是消息的堆积问题1.2 消息堆积的解决思路 二、惰性队列解决消息堆积问题2.1 惰性队列和普通队列的区别2.2 惰性队列的声明方式2.3 演示惰性队列接收大量消息2.4 惰性队列的优缺点 一、消息的堆积问题 1.1 什么是消息的堆积问题 消息的堆积…...

深度优先遍历与连通分量
深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。 下图示例的…...

Python学习笔记--类的继承
七、类的继承 1、定义类的继承 说到继承,你一定会联想到继承你老爸的家产之类的。 类的继承也是一样。 比如有一个旧类,是可以算平均数的。然后这时候有一个新类,也要用到算平均数,那么这时候我们就可以使用继承的方式。新类继…...