python教程:python中的继承及其使用的案例

在 Python 中,继承是一种面向对象编程的核心概念,允许一个类从另一个类继承属性和方法。通过继承,子类(派生类)可以重用父类(基类)的代码,同时还能扩展或重写父类的功能。继承使代码更加模块化、易于维护,并且有助于避免重复代码。

继承的基本概念:

  1. 父类(基类):被继承的类。
  2. 子类(派生类):继承父类的类,子类可以继承父类的属性和方法。
  3. 方法重写:子类可以重新定义父类中已有的方法,以实现不同的行为。
  4. super() 函数:子类可以使用 super() 调用父类的方法。

继承的基本语法

在 Python 中,通过在子类定义时将父类作为参数传递来实现继承:

class ParentClass:# 父类定义passclass ChildClass(ParentClass):# 子类定义,继承自 ParentClasspass

示例:基本的继承

# 定义父类 Animal
class Animal:def __init__(self, name):self.name = namedef speak(self):return f"{self.name} makes a sound."# 定义子类 Dog,继承自 Animal
class Dog(Animal):def __init__(self, name, breed):super().__init__(name)  # 调用父类的构造函数self.breed = breeddef speak(self):return f"{self.name}, the {self.breed}, barks."# 创建子类 Dog 的实例
dog = Dog("Buddy", "Golden Retriever")# 调用子类的方法
print(dog.speak())  # 输出:Buddy, the Golden Retriever, barks.
解释:
  1. 父类 Animal:定义了构造函数 __init__ 和方法 speak。所有 Animal 对象都有一个 name 属性。
  2. 子类 Dog:继承了 Animal 类,并扩展了 __init__ 方法,添加了 breed 属性。使用 super() 调用了父类的 __init__ 方法来初始化 name 属性。子类还重写了父类的 speak 方法。
  3. super():通过 super() 调用了父类的构造函数,确保 name 属性正确初始化。

方法重写

方法重写是子类中的一个重要特性。子类可以重写从父类继承的方法,以提供不同的实现。

示例:方法重写
class Animal:def speak(self):return "Animal makes a sound."class Dog(Animal):def speak(self):return "Dog barks."class Cat(Animal):def speak(self):return "Cat meows."# 创建 Dog 和 Cat 的实例
dog = Dog()
cat = Cat()# 调用子类重写的方法
print(dog.speak())  # 输出:Dog barks.
print(cat.speak())  # 输出:Cat meows.
解释:
  • DogCat 类分别重写了 Animal 类中的 speak 方法,因此当调用 speak 时,它们提供了自己的实现。

多重继承

Python 支持多重继承,即一个子类可以继承多个父类。多重继承可以让子类获得多个父类的属性和方法。

示例:多重继承
class Animal:def eat(self):print("Animal is eating.")class Canine:def bark(self):print("Canine is barking.")# Dog 类继承自 Animal 和 Canine
class Dog(Animal, Canine):pass# 创建 Dog 的实例
dog = Dog()# 调用继承的方法
dog.eat()  # 输出:Animal is eating.
dog.bark()  # 输出:Canine is barking.
解释:
  • Dog 类同时继承了 AnimalCanine,因此它可以调用这两个父类中的方法。

super() 函数

super() 函数用于调用父类的方法,尤其是在子类中扩展或重写父类的方法时非常有用。

示例:super() 的使用
class Animal:def __init__(self, name):self.name = namedef speak(self):return f"{self.name} makes a sound."class Dog(Animal):def __init__(self, name, breed):# 使用 super() 调用父类的 __init__ 方法super().__init__(name)self.breed = breeddef speak(self):# 使用 super() 调用父类的 speak 方法parent_speak = super().speak()return f"{parent_speak} Specifically, the {self.breed} barks."# 创建 Dog 类的实例
dog = Dog("Buddy", "Golden Retriever")# 调用子类的 speak 方法
print(dog.speak())
# 输出:
# Buddy makes a sound. Specifically, the Golden Retriever barks.
解释:
  • Dog__init__ 方法中,super().__init__(name) 调用了 Animal 类的构造函数,确保 name 属性被正确初始化。
  • speak 方法中,super().speak() 调用了父类 Animalspeak 方法,并在此基础上进行了扩展。

检查继承关系

Python 提供了一些内置函数来检查类与类之间的继承关系:

  1. issubclass(ChildClass, ParentClass):检查某个类是否是另一个类的子类。
  2. isinstance(object, Class):检查某个对象是否是某个类或其子类的实例。
示例:
class Animal:passclass Dog(Animal):pass# 检查继承关系
print(issubclass(Dog, Animal))  # 输出:True
print(isinstance(Dog(), Animal))  # 输出:True

多重继承和 MRO(方法解析顺序)

在多重继承中,Python 使用**方法解析顺序(MRO)**来确定在继承树中调用方法的顺序。MRO 可以通过 ClassName.mro()help(ClassName) 查看。

示例:
class A:def process(self):print("Processing in A")class B(A):def process(self):print("Processing in B")super().process()class C(A):def process(self):print("Processing in C")super().process()class D(B, C):def process(self):print("Processing in D")super().process()d = D()
d.process()# 查看 MRO
print(D.mro())
输出:
Processing in D
Processing in B
Processing in C
Processing in A
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
解释:
  • MRO 确定了方法的调用顺序:D -> B -> C -> A -> object
  • 通过 super(),每个类的 process 方法按照 MRO 顺序依次被调用。

总结

  • 继承允许子类继承父类的属性和方法,使代码更简洁且易于维护。
  • 子类可以通过方法重写来自定义行为,并通过 super() 调用父类的方法。
  • 多重继承允许一个类从多个父类继承属性和方法,但需要注意多重继承中的 MRO 顺序。
  • Python 提供了 issubclassisinstance 用于检查继承关系。

继承是 Python 面向对象编程的强大工具,合理使用继承可以提高代码的可复用性和扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python知识点:基于Python技术和工具,如何使用Chainlink进行链下数据访问

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何使用Chainlink进行链下数据访问 在区块链开发中&#xff0c;智能合约通常需…

每天花2分钟学数字化转型,第三讲:数智化

​对于智能化&#xff08;intelligence&#xff09;&#xff0c;我的理解是&#xff1a;你中有我&#xff0c;我中有你「人机一体」的世界。 阅读本文&#xff0c;你将快速知晓“智能化”的定义与价值&#xff0c;通过生活实例让你对智能化有一个全新的理解。 最后还会介绍“…

Vue.js 组件开发基本步骤

Vue.js 是一个构建用户界面的渐进式框架&#xff0c;它被设计为能够轻松地被集成进项目的部分功能&#xff0c;或者用于构建完整的前端应用。组件化是 Vue.js 的核心概念之一&#xff0c;它允许开发者将界面拆分成独立、可复用的组件&#xff0c;每个组件负责应用中的一小部分功…

021 elasticsearch索引管理

文章目录 索引的管理1创建索引库2删除索引3设置mapping创建索引库时定义mapping先创建索引库然后设置mapping 4设置settings创建索引库时设置settings创建索引之后修改settings 概念说明索引库(indexes)索引库包含一堆相关业务&#xff0c;结构相似的文档document数据&#xff…

ROS2中级面试题汇总

大家好&#xff0c;我是小白小帅&#xff0c;继更新了ros2初级面试题汇总之后&#xff0c;我又马不停蹄的整理了关于ros2的中级面试题&#xff08;共25道&#xff09;&#xff0c;这些问题也相较于初级面试题上升了一定难度&#xff0c;希望小伙伴们打牢ros2基础&#xff0c;如…

键盘突然用不了,怎么处理

文章目录 1、切换输入法试试2、检查键盘的3个指示灯是否全亮 1、切换输入法试试 2、检查键盘的3个指示灯是否全亮 检查键盘的三个指示灯通常指的是 Num Lock、Caps Lock 和 Scroll Lock 键的状态灯 检查键盘的三个指示灯通常指的是 Num Lock、Caps Lock 和 Scroll Lock 键的状…

全栈开发小项目

用到的技术栈&#xff1a; nodejswebpackknockoutmongodbPM2rabbitmq 以下是一个综合指南&#xff0c;展示如何将 Node.js、Webpack、Knockout.js、MongoDB、PM2 和 RabbitMQ 集成到一个项目中。 我们将在这一项目中添加 RabbitMQ&#xff0c;用于处理消息队列。这对于任务分…

Keil中代码补全功能和自动缩进功能设置

一、自动缩进功能的设置&#xff0c;在按回车键换行或者按Tab键的时候是有缩进的&#xff0c;还可以进行缩进设置。可以通过以下步骤进行设置&#xff1a;①Edit&#xff08;编辑&#xff09;->②Configuration(配置)->③Tab size&#xff08;Tab缩进长度&#xff09;在T…

单机redis和mysql服务器的承载压力

单机环境下&#xff0c;Redis 和 MySQL 的承载压力主要取决于多种因素&#xff0c;如硬件配置、数据规模、查询模式、读写比例、以及优化程度等。以下是一些关键点&#xff1a; Redis 的承载压力 Redis 是基于内存的键值数据库&#xff0c;通常用于高速缓存和高频率读取场景…

在Linux中搭建WordPress并实现Windows主机远程访问

WordPreWordPress是一个基于PHP开发的开源平台&#xff0c;适用于在支持PHP与MySQL数据库的服务器上搭建个性化博客或网站。同时&#xff0c;它也能够作为功能强大的内容管理系统&#xff08;CMS&#xff09;被广泛应用。 虚拟机&#xff1a;VirtualBox 虚拟机安装&#x1f449…

ES-入门-http-多条件查询范围查询

must 表示多个条件需要同时满足 在postman 对应的参数配置如下 {"query": {"bool": {"must" : [{"match" :{"category":"小米"}},{"match":{"price":3999.00}}]}} } 如下图查询的结果是需…

Golang 代码质量检查工具 | golangci-lint

背景 开发团队代码&#xff0c;保持一个统一的风格和规范&#xff0c;有利于团队协作和交流。 对代码进行质量检查&#xff0c;能达到以下作用&#xff1a; 提高代码质量&#xff1a;代码质量检查可以帮助团队发现潜在的错误和问题&#xff0c;从而提高代码的稳定性和可靠性。…

Power BI:链接数据库与动态数据展示案例

一、案例背景 在数据驱动的时代&#xff0c;如何高效、直观地展示和分析数据成为了企业决策和个人洞察的关键。Power BI作为一款强大的商业智能工具&#xff0c;凭借其强大的数据连接能力、丰富的可视化选项以及交互性和动态性&#xff0c;成为了众多企业和个人的首选。本文将…

Anthropic分享RAG最佳实践:Contextual Retrieval

先说结论&#xff0c;Anthropic提出了一种显著改进RAG中检索步骤的方法。这种方法被称为“上下文检索&#xff08;Contextual Retrieval&#xff09;”&#xff1a; 它使用两种子技术&#xff1a;上下文嵌入&#xff08;Contextual Embeddings&#xff09;和上下文BM25这种方法…

Invoke 和 InvokeRequired以及他们两个的区别

在.NET中&#xff0c;Invoke和InvokeRequired是Windows Forms编程中用于确保线程安全的关键方法和属性。它们通常用在多线程环境中&#xff0c;以确保UI控件的更新操作在创建控件的线程上执行&#xff0c;避免因跨线程操作导致的异常。 InvokeRequired 属性 InvokeRequired属…

pdf删除几个页面怎么操作?PDF页面删除的快捷方法

pdf删除几个页面怎么操作&#xff1f;在日常办公与学习中&#xff0c;PDF文件因其跨平台兼容性和良好的格式保持性而广受欢迎。然而&#xff0c;随着文件内容的累积&#xff0c;PDF文档往往会变得庞大而臃肿&#xff0c;不仅占用存储空间&#xff0c;还可能在传输时造成不便。因…

mysql 慢查询日志slowlog

慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…

FAST-LIVO复现

文章目录 FAST-LIVO准备工作编译运行复现效果 FAST-LIVO FAST-LIVO&#xff08;Fast LiDAR-Inertial-Visual Odometry&#xff09;是一种融合LiDAR&#xff08;激光雷达&#xff09;、惯性测量单元&#xff08;IMU&#xff09;和视觉信息的里程计算法。它旨在提供高精度和实时…

MySQL 执行流程是怎样的?

可以看到&#xff0c; MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层&#xff0c; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现。存储引擎层负责数据的存储和读取。 InnoDB、MyISAM、Memory。不同的存储引擎共用一个 Server 层…

7-基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡

一、板卡概述 本板卡系我公司自主研发&#xff0c;基于6U CPCI的通用高性能信号处理平台。板卡采用一片国产8核DSP FT-C6678和一片国产FPGA JFM7K325T-2FFG900作为主处理器。为您提供了丰富的运算资源。如下图所示&#xff1a; 二、设计参考标准 ● PCIMG 2.0 R3.0 CompactP…