当前位置: 首页 > article >正文

Python的那些事第九篇:从单继承到多继承的奇妙之旅

Python 继承:从单继承到多继承的奇妙之旅


 


目录

Python 继承:从单继承到多继承的奇妙之旅

一、引言

二、继承的概念与语法

三、单继承

四、多继承

五、综合代码示例

六、总结


一、引言

在编程的世界里,继承就像是一场神奇的魔法,让代码能够“复制粘贴”并“升级进化”。想象一下,你有一个超级厉害的机器人(父类),它能走路、说话、还会跳舞。现在你想造一个更厉害的机器人(子类),不仅继承了走路、说话、跳舞的技能,还能飞。继承就帮你轻松实现了这个目标。接下来,就让我们踏上这场继承的奇妙之旅吧!


二、继承的概念与语法

(一)继承的概念

继承是一种面向对象编程中的重要机制,它允许一个类(子类)继承另一个类(父类)的属性和方法。这就好比是孩子继承了父母的基因,父母有的特征(属性)和能力(方法),孩子也能拥有。通过继承,我们能够复用代码,减少重复编写,让代码更加简洁高效。

(二)继承的语法

在 Python 中,继承的语法非常简单。只需要在定义子类时,在括号中写上父类的名字即可。比如:

class Parent:passclass Child(Parent):pass

这就表示 Child 类继承了 Parent 类。


三、单继承

单继承是指一个子类只继承一个父类。这就像是一对一的传承,一个孩子只从一个父母那里继承基因。

(一)子类对父类的继承

当子类继承父类时,它会自动获得父类的所有属性和方法。这就好比是孩子出生时自带了父母的基因,不需要额外去学习。

表格说明
父类属性/方法子类是否继承
属性
方法
实例
class Animal:def __init__(self, name):self.name = name  # 父类的属性def eat(self):print(f"{self.name} is eating.")  # 父类的方法class Dog(Animal):pass# 创建子类对象
my_dog = Dog("Buddy")
print(my_dog.name)  # 继承了父类的属性
my_dog.eat()  # 继承了父类的方法

输出结果:

Buddy
Buddy is eating.

(二)属性继承

子类会继承父类的属性。这就好比是孩子继承了父母的眼睛颜色、头发颜色等外貌特征。

表格说明
父类属性子类继承后的情况
name子类可以访问
实例
class Person:def __init__(self, name):self.name = name  # 父类的属性class Student(Person):pass# 创建子类对象
student = Student("Alice")
print(student.name)  # 子类继承了父类的属性

输出结果:

Alice

(三)方法继承

子类会继承父类的方法。这就好比是孩子继承了父母的走路方式、说话方式等行为特征。

表格说明
父类方法子类继承后的情况
eat()子类可以调用
实例
class Vehicle:def start(self):print("Vehicle is starting.")  # 父类的方法class Car(Vehicle):pass# 创建子类对象
my_car = Car()
my_car.start()  # 子类继承了父类的方法

输出结果:

Vehicle is starting.

(四)方法重写

有时候,子类可能需要对继承来的父类方法进行修改,这就叫方法重写。这就好比是孩子虽然继承了父母的走路方式,但长大后学会了更优雅的走路姿势。

表格说明
父类方法子类重写后的情况
eat()子类可以覆盖
实例
class Animal:def speak(self):print("Animal is speaking.")  # 父类的方法class Dog(Animal):def speak(self):print("Dog is barking.")  # 子类重写父类的方法# 创建子类对象
my_dog = Dog()
my_dog.speak()  # 调用子类重写后的方法

输出结果:

Dog is barking.


四、多继承

多继承是指一个子类可以继承多个父类。这就好比是孩子有两个父母,同时继承了两个父母的基因。

(一)Python 中支持多继承的语法

在 Python 中,多继承的语法也非常简单。只需要在定义子类时,在括号中列出多个父类即可。比如:

class Parent1:passclass Parent2:passclass Child(Parent1, Parent2):pass

这就表示 Child 类继承了 Parent1Parent2

(二)菱形继承问题

菱形继承问题是多继承中一个比较复杂的情况。它是指当一个类继承了两个父类,而这两个父类又共同继承了一个祖先类时,就会出现菱形结构。这就好比是孩子有两个父母,而这两个父母又有一个共同的祖父母。如果不小心处理,可能会导致一些问题,比如重复继承祖先类的属性和方法。

表格说明
祖先类属性/方法继承路径1继承路径2子类继承后的情况
name父类1 -> 子类父类2 -> 子类子类只继承一次
实例
class Grandparent:def __init__(self):self.name = "Grandparent"  # 祖先类的属性class Parent1(Grandparent):def speak(self):print("Parent1 is speaking.")  # 父类1的方法class Parent2(Grandparent):def walk(self):print("Parent2 is walking.")  # 父类2的方法class Child(Parent1, Parent2):pass# 创建子类对象
child = Child()
print(child.name)  # 子类继承了祖先类的属性
child.speak()  # 子类继承了父类1的方法
child.walk()  # 子类继承了父类2的方法

输出结果:

Grandparent
Parent1 is speaking.
Parent2 is walking.

五、综合代码示例

下面是一个综合代码示例,涉及上述所有知识点:

# 祖先类
class Grandparent:def __init__(self, name):self.name = name  # 祖先类的属性def introduce(self):print(f"Hello, I'm {self.name}.")  # 祖先类的方法# 父类1
class Parent1(Grandparent):def __init__(self, name, hobby):super().__init__(name)  # 调用祖先类的构造方法self.hobby = hobby  # 父类1的属性def speak(self):print(f"{self.name} likes {self.hobby}.")  # 父类1的方法# 父类2
class Parent2(Grandparent):def __init__(self, name, job):super().__init__(name)  # 调用祖先类的构造方法self.job = job  # 父类2的属性def work(self):print(f"{self.name} works as a {self.job}.")  # 父类2的方法# 子类
class Child(Parent1, Parent2):def __init__(self, name, hobby, job, school):Parent1.__init__(self, name, hobby)  # 显式调用父类1的构造方法Parent2.__init__(self, name, job)  # 显式调用父类2的构造方法self.school = school  # 子类的属性def study(self):print(f"{self.name} studies at {self.school}.")  # 子类的方法def introduce(self):super().introduce()  # 调用祖先类的方法print(f"I'm a child of {Parent1.__name__} and {Parent2.__name__}.")  # 子类重写祖先类的方法# 创建子类对象
child = Child("Alice", "reading", "doctor", "Wonderland School")
child.introduce()  # 调用子类重写后的方法
child.speak()  # 调用父类1的方法
child.work()  # 调用父类2的方法
child.study()  # 调用子类的方法

输出结果:

Hello, I'm Alice.
I'm a child of Parent1 and Parent2.
Alice likes reading.
Alice works as a doctor.
Alice studies at Wonderland School.

六、总结

通过这次奇妙的继承之旅,我们了解了继承的概念、单继承和多继承的语法及特点,还解决了菱形继承问题。继承就像是编程世界里的超级英雄,帮助我们轻松地复用代码,让代码更加简洁高效。希望你也能在编程中灵活运用继承,创造出更多神奇的代码!


相关文章:

Python的那些事第九篇:从单继承到多继承的奇妙之旅

Python 继承:从单继承到多继承的奇妙之旅 目录 Python 继承:从单继承到多继承的奇妙之旅 一、引言 二、继承的概念与语法 三、单继承 四、多继承 五、综合代码示例 六、总结 一、引言 在编程的世界里,继承就像是一场神奇的魔法&#…...

Excel to form ?一键导入微软表单

一句话痛点 “你的Excel越强大,手动复制到Forms就越痛苦。” 合并单元格崩溃成乱码、下拉菜单变纯文本、条件逻辑消失无踪——这些不是技术问题,而是低效工作模式的死刑判决书。 直击解决方案:3分钟,3步,300%效率 1…...

pandas(三)Series使用

一、Series基础使用 import pandasd {x:100,y:200,z:300} s1 pandas.Series(d) #将dict转化为Series print(s1)print("") l1 [1, 2, 3] l2 [a, b, c] s2 pandas.Series(l1, indexl2) #list转为Series print(s2)print("") s3 pandas.Series([11…...

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、使用Chatbox进行交互5.1 下载Chatbox安装包…...

从零开始学 HTML:构建网页的基本框架与技巧

系列文章目录 01-从零开始学 HTML&#xff1a;构建网页的基本框架与技巧 文章目录 系列文章目录前言一、HTML 文档的基本框架1.1 <!DOCTYPE html>、<html>、<head>、<body> 标签解析1.1.1 <!DOCTYPE html> 标签1.1.2 <html> 标签1.1.3 &l…...

如何用微信小程序写春联

​ 生活没有模板,只需心灯一盏。 如果笑能让你释然,那就开怀一笑;如果哭能让你减压,那就让泪水流下来。如果沉默是金,那就不用解释;如果放下能更好地前行,就别再扛着。 一、引入 Vant UI 1、通过 npm 安装 npm i @vant/weapp -S --production​​ 2、修改 app.json …...

2025最新在线模型转换工具onnx转换ncnn,mnn,tengine等

文章目录 引言最新网址地点一、模型转换1. 框架转换全景图2. 安全的模型转换3. 网站全景图 二、转换说明三、模型转换流程图四、感谢 引言 在yolov5&#xff0c;yolov8&#xff0c;yolov11等等模型转换的领域中&#xff0c;时间成本常常是开发者头疼的问题。最近发现一个超棒的…...

算法每日双题精讲 —— 前缀和(【模板】一维前缀和,【模板】二维前缀和)

在算法竞赛与日常编程中&#xff0c;前缀和是一种极为实用的预处理技巧&#xff0c;能显著提升处理区间和问题的效率。今天&#xff0c;我们就来深入剖析一维前缀和与二维前缀和这两个经典模板。 一、【模板】一维前缀和 题目描述 给定一个长度为 n n n 的整数数组 a a a&…...

C++泛型编程指南03-CTAD

文章目录 C17 自定义类型推断指引&#xff08;CTAD&#xff09;深度解析一、基础概念1. 核心作用2. 工作原理 二、标准库中的 CTAD 应用1. 容器类型推导2. 智能指针推导3. 元组类型推导 三、自定义推导指引语法1. 基本语法结构2. 典型应用场景 四、推导指引设计模式1. 迭代器范…...

记8(高级API实现手写数字识别

目录 1、Keras&#xff1a;2、Sequential模型&#xff1a;2.1、建立Sequential模型&#xff1a;modeltf.keras.Sequential()2.2、添加层&#xff1a;model.add(tf.keras.layers.层)2.3、查看摘要&#xff1a;model.summary()2.4、配置训练方法&#xff1a;model.compile(loss,o…...

88.[4]攻防世界 web php_rce

之前做过&#xff0c;回顾&#xff08;看了眼之前的wp,跟没做过一样&#xff09; 属于远程命令执行漏洞 在 PHP 里&#xff0c;system()、exec()、shell_exec()、反引号&#xff08;&#xff09;等都可用于执行系统命令。 直接访问index.php没效果 index.php?sindex/think\a…...

23.Word:小王-制作公司战略规划文档❗【5】

目录 NO1.2.3.4 NO5.6​ NO7.8.9​ NO10.11​ NO12​ NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张&#xff1a;纸张大小&#xff1a;宽度/高度→页边距&#xff1a;上下左右→版式&#xff1a;页眉页脚→文档网格&#xff1a;勾选只指定行网格✔→ 每页&#xff1a;…...

在Arm芯片苹果Mac系统上通过homebrew安装多版本mysql并解决各种报错,感谢deepseek帮助解决部分问题

背景&#xff1a; 1.苹果设备上安装mysql&#xff0c;随着苹果芯片的推出&#xff0c;很多地方都变得不一样了。 2.很多时候为了老项目能运行&#xff0c;我们需要能安装mysql5.7或者mysql8.0或者mysql8.2.虽然本文编写时最新的默认mysql已经是9.2版本。 安装步骤 1.执行hom…...

C++【iostream】数据库的部分函数功能介绍

在 C 编程世界中&#xff0c;iostream 库扮演着举足轻重的角色&#xff0c;它是 C 标准库的核心组成部分&#xff0c;为程序提供了强大的输入输出功能。无论是简单的控制台交互&#xff0c;还是复杂的文件操作&#xff0c;iostream 库都能提供便捷高效的解决方案。本文将深入剖…...

数据结构 树1

目录 前言 一&#xff0c;树的引论 二&#xff0c;二叉树 三&#xff0c;二叉树的详细理解 四&#xff0c;二叉搜索树 五&#xff0c;二分法与二叉搜索树的效率 六&#xff0c;二叉搜索树的实现 七&#xff0c;查找最大值和最小值 指针传递 vs 传引用 为什么指针按值传递不会修…...

【实战篇章】深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据

文章目录 深入探讨&#xff1a;服务器如何响应前端请求及后端如何查看前端提交的数据一、服务器如何响应前端请求HTTP 请求生命周期全解析1.前端发起 HTTP 请求&#xff08;关键细节强化版&#xff09;2. 服务器接收请求&#xff08;深度优化版&#xff09; 二、后端如何查看前…...

玩转ChatGPT:DeepSeek测评(科研思路梳理)

一、写在前面 DeepSeek-R1出圈了&#xff0c;把OpenAI的o3-mini模型都提前逼上线了&#xff08;还免费使用&#xff09;。 都号称擅长深度推理&#xff0c;那么对于科研牛马的帮助有多大呢&#xff1f; 我连夜试一试。 二、科研思路梳理 有时候我们牛马们做了一堆结果以后&…...

python学opencv|读取图像(五十三)原理探索:使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习进程中&#xff0c;已经探索了使用cv.matchTemplate()函数实现最佳图像匹配的技巧&#xff0c;并且成功对两个目标进行了匹配。 相关文章链接为&#xff1a;python学opencv|读取图像&#xff08;五十二&#xff09;使用cv.matchTemplate()函数实现最佳图像…...

AJAX RSS Reader:技术解析与应用场景

AJAX RSS Reader:技术解析与应用场景 引言 随着互联网的快速发展,信息量呈爆炸式增长。为了方便用户快速获取感兴趣的信息,RSS(Really Simple Syndication)技术应运而生。AJAX RSS Reader作为一种基于AJAX技术的信息读取工具,在用户体验和信息获取方面具有显著优势。本…...

Linux环境下的Java项目部署技巧:安装 Mysql

查看 myslq 是否安装&#xff1a; rpm -qa|grep mysql 如果已经安装&#xff0c;可执行命令来删除软件包&#xff1a; rpm -e --nodeps 包名 下载 repo 源&#xff1a; http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 执行命令安装 rpm 源(根据下载的…...

gitea - fatal: Authentication failed

文章目录 gitea - fatal: Authentication failed概述run_gitea_on_my_pkm.bat 笔记删除windows凭证管理器中对应的url认证凭证启动gitea服务端的命令行正常用 TortoiseGit 提交代码备注END gitea - fatal: Authentication failed 概述 本地的git归档服务端使用gitea. 原来的用…...

计算机网络安全与运维的关键 —— 常用端口全解析

目录 前言 常见端口分类及用途 20 端口&#xff08;FTP 数据传输&#xff09; 21 端口&#xff08;FTP 消息控制&#xff09; 22 端口&#xff08;SSH&#xff09; 23 端口&#xff08;Telnet&#xff09; 25 端口&#xff08;SMTP&#xff09; 53 端口&#xff08;DNS&…...

JavaScript Navigator:深入理解浏览器导航机制

JavaScript Navigator:深入理解浏览器导航机制 引言 在Web开发中,浏览器导航是用户与网页交互的重要部分。JavaScript Navigator对象提供了丰富的API,允许开发者深入理解并控制浏览器的导航行为。本文将详细介绍JavaScript Navigator对象的功能、使用方法以及在实际开发中…...

笔灵ai写作技术浅析(三):深度学习

笔灵AI写作的深度学习技术主要基于Transformer架构,尤其是GPT(Generative Pre-trained Transformer)系列模型。 1. Transformer架构 Transformer架构由Vaswani等人在2017年提出,是GPT系列模型的基础。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全依赖自…...

Linux-CentOS的yum源

1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源&#xff0c;163源&#xff0c;sohu源&#xff0c;知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…...

< OS 有关> BaiduPCS-Go 程序的 菜单脚本 Script: BaiduPCS-Go.Menu.sh (bdgo.sh)

目标&#xff1a; 使用 日本阿里云的 VPM 传输文件。 暂时方案&#xff1a; 使用 主机JPN 下载 https://huggingface.co/ 上模型从 JPN 放到 度狗上在家里从狗度下载 为了减少编程&#xff0c;尽量使用现在软件 &#xff0c;就找到 GitHub - qjfoidnh/BaiduPCS-Go: iikira…...

【前端学习路线】前端优化 详细知识点学习路径(附学习资源)

&#x1f4da;学习资源&#xff1a; 前端开发&#xff1a;零基础入门到项目实战 >> 前端开发&#xff1a;边学边练 >> 原学习路径下载 >>...

deepseek v3 搭建个人知识库

目录 deepseek-r1本地部署&#xff0c;这个比较好&#xff0c;推荐 Chatbox连接ollama服务 知乎教程&#xff0c;需要注册&#xff1a; deepseek-r1本地部署&#xff0c;这个比较好&#xff0c;推荐 公司数据不泄露&#xff0c;DeepSeek R1本地化部署web端访问个人知识库搭建…...

LeetCode 2909. 元素和最小的山形三元组 II

**### LeetCode 2909. 元素和最小的山形三元组 II 问题描述 给定一个下标从 0 开始的整数数组 nums&#xff0c;我们需要找到一个“山形三元组”&#xff08;i, j, k&#xff09;满足以下条件&#xff1a; i < j < knums[i] < nums[j] 且 nums[k] < nums[j] 并…...

C#面试常考随笔4:int? 和 int的区别,以及int?的运用场景?

可空性 int?&#xff1a;它是int的可空类型&#xff0c;允许将null赋值给该变量。int?实际上是Nullable<int>的缩写形式&#xff0c;是一个可以为null的整数类型。例如&#xff1a;int? num2 null;或者int? num3 10;都是合法的。 内存分配与存储 int?&#xff…...