Python面向对象编程:继承和多态③

news2024/10/17 19:32:25

在这里插入图片描述

文章目录

    • 一、继承
      • 1.1 什么是继承
      • 1.2 定义父类和子类
      • 1.3 子类重写父类的方法
      • 1.4 多继承
    • 二、多态
      • 2.1 什么是多态
      • 2.2 多态的实现
      • 2.3 抽象类和接口
    • 三、综合详细例子
      • 3.1 项目结构
      • 3.2 模块代码
        • init.py
        • shape.py
        • circle.py
        • rectangle.py
      • 3.3 主程序代码
        • main.py
      • 3.4 运行结果
    • 四、总结

Python是一门强大的面向对象编程语言,它支持许多面向对象编程的特性,其中最重要的两个概念就是继承和多态。继承允许我们基于现有的类创建新类,从而实现代码重用和层次化设计;多态则允许对象以多种形式表现,使代码更加灵活和可扩展。

本文将详细介绍Python中的继承和多态,并通过一个综合详细的例子来展示它们的实际应用。

一、继承

1.1 什么是继承

继承是面向对象编程的一个核心概念,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码重用和层次化设计。通过继承,子类不仅可以拥有父类的所有属性和方法,还可以添加自己的属性和方法,甚至重写父类的方法。

1.2 定义父类和子类

在Python中,定义父类和子类非常简单。子类通过括号中的父类名称来继承父类:

class Parent:
    def __init__(self, name):
        self.name = name

    def greet(self):
        return f"Hello, my name is {self.name}."

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)  # 调用父类的构造方法
        self.age = age

    def introduce(self):
        return f"I am {self.age} years old."

在上面的例子中,Child类继承了Parent类,并添加了一个新的属性age和一个新的方法introduce

1.3 子类重写父类的方法

子类可以重写父类的方法,以提供新的实现:

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

    def greet(self):
        return f"Hello, my name is {self.name} and I am {self.age} years old."

在上面的例子中,Child类重写了Parent类的greet方法。

1.4 多继承

Python还支持多继承,即一个类可以继承多个父类:

class Parent1:
    def method1(self):
        return "Method from Parent1"

class Parent2:
    def method2(self):
        return "Method from Parent2"

class Child(Parent1, Parent2):
    pass

在上面的例子中,Child类同时继承了Parent1Parent2类,拥有这两个类的所有方法。

二、多态

2.1 什么是多态

多态是指不同类的对象可以通过相同的接口调用,而具体的实现则依赖于对象所属的类。多态使得代码更加灵活和可扩展,能够处理不同类型的对象。

2.2 多态的实现

多态的实现通常依赖于继承和方法重写。在Python中,可以通过定义父类和子类,并在子类中重写父类的方法来实现多态:

class Animal:
    def speak(self):
        raise NotImplementedError("Subclass must implement abstract method")

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

def make_animal_speak(animal):
    print(animal.speak())

在上面的例子中,Animal是一个父类,DogCat是子类,它们都实现了speak方法。make_animal_speak函数可以接受任何Animal类的对象,并调用其speak方法。

2.3 抽象类和接口

在实际应用中,我们常常使用抽象类和接口来实现多态。抽象类是不能实例化的类,它通常包含抽象方法,子类必须实现这些方法。Python中的抽象类可以使用abc模块来定义:

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

在上面的例子中,Animal是一个抽象类,包含一个抽象方法speak。子类DogCat必须实现speak方法。

三、综合详细例子

下面是一个综合详细的例子,展示如何使用继承和多态实现一个简单的图形绘制系统。

3.1 项目结构

shapes/
    __init__.py
    shape.py
    circle.py
    rectangle.py
main.py

3.2 模块代码

init.py

__init__.py 文件用于将 shapes 目录标识为一个包。在这个例子中,__init__.py 文件可以是空的,或者可以用于导入包中的所有模块。

shapes/init.py

from .shape import Shape
from .circle import Circle
from .rectangle import Rectangle

__all__ = ["Shape", "Circle", "Rectangle"]
shape.py
# shapes/shape.py

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def draw(self):
        pass

    @abstractmethod
    def area(self):
        pass
circle.py
# shapes/circle.py

import math
from .shape.py import Shape

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def draw(self):
        return f"Drawing a circle with radius {self.radius}"

    def area(self):
        return math.pi * self.radius ** 2

    def __str__(self):
        return f"Circle(radius={self.radius})"
rectangle.py
# shapes/rectangle.py

from .shape import Shape

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def draw(self):
        return f"Drawing a rectangle with width {self.width} and height {self.height}"

    def area(self):
        return self.width * self.height

    def __str__(self):
        return f"Rectangle(width={self.width}, height={self.height})"

3.3 主程序代码

main.py
# main.py

from shapes.circle import Circle
from shapes.rectangle import Rectangle

def main():
    shapes = [
        Circle(5),
        Rectangle(3, 4),
        Circle(10)
    ]

    for shape in shapes:
        print(shape.draw())
        print(f"Area: {shape.area()}")
        print()

if __name__ == "__main__":
    main()

3.4 运行结果

Drawing a circle with radius 5
Area: 78.53981633974483

Drawing a rectangle with width 3 and height 4
Area: 12

Drawing a circle with radius 10
Area: 314.1592653589793

四、总结

本文详细介绍了Python面向对象编程中的继承和多态,包括继承的定义、子类的创建和重写、多继承的实现、多态的概念和实现、抽象类和接口等。通过综合详细的例子展示了如何在实际项目中应用这些概念。希望本文对你理解和掌握Python面向对象编程中的继承和多态有所帮助。


欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

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

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

相关文章

实用篇—高效批量复制INSERT语句,并去除某列

在数据库管理中,常常需要将数据从一个表复制到另一个表。使用 Navicat 等工具可以方便地导出多条 INSERT 语句,但有时我们不需要某些列(如 ID 列)。本文将介绍如何在 Navicat 中复制多条 INSERT 语句,并去除 ID 列以便…

C语言笔记 14

函数原型 函数的先后关系 我们把自己定义的函数isPrime()写在main函数上面 是因为C的编译器自上而下顺序分析你的代码,在看到isPrime的时候,它需要知道isPrime()的样子——也就是isPrime()要几个参数,每个参数的类型如何,返回什么…

python画图|在三维空间的不同平面上分别绘制不同类型二维图

【1】引言 前序已经完成了基础的二维图和三维图绘制教程探索,可直达的链接包括但不限于: python画图|3D参数化图形输出-CSDN博客 python画三角函数图|小白入门级教程_正余弦函数画图python-CSDN博客 在学习过程中,发现一个案例&#xff1…

XGBoost回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出

回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出 目录 回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 XGBoost的全称是eXtreme Gradient Boosting,它是经过优化的分布式梯度提升库,旨在高效、…

优化UVM环境(三)-环境发包较多时,会触发timeout

书接上回: 优化UVM环境(一)-环境结束靠的是timeout,而不是正常的objection结束 优化UVM环境(二)-将error/fatal红色字体打印,pass绿色字体打印 环境发包较多时,会触发timeout 解决…

SpringBoot +Vue3前后端分离项目入门基础实例五

项目说明 项项目名称使用框架说明后端项目springboot_vue_element_demoSpringBoot + MyBatis-plus + MySQL完成基本的增删改查操作API前端项目vue-projectVue3 + ElementUI plus + axios界面展示,调用后端API项目文档目录 SpringBoot +Vue3前后端分离项目入门基础实例一 Spri…

机器学习:opencv--人脸检测以及微笑检测

目录 前言 一、人脸检测的原理 1.特征提取 2.分类器 二、代码实现 1.图片预处理 2.加载分类器 3.进行人脸识别 4.标注人脸及显示 三、微笑检测 前言 人脸检测是计算机视觉中的一个重要任务,旨在自动识别图像或视频中的人脸。它可以用于多种应用&#xff0…

【C++】- STL之vector模拟实现

1.vector的介绍 vector是表示可变大小数组的序列容器。vector采用的连续存储空间来存储元素。意味着也可以采用下标对vector的元素进行访问,和数组一样高效。但是它的大小是可以动态改变的,而且它的大小会被容器自动处理。vector使用动态分配数组来存储它…

三子棋(C 语言)

目录 一、游戏设计的整体思路二、各个步骤的代码实现1. 菜单及循环选择的实现2. 棋盘的初始化和显示3. 轮流下棋及结果判断实现4. 结果判断实现 三、所有代码四、总结 一、游戏设计的整体思路 (1)提供一个菜单让玩家选择人机对战、玩家对战或者退出游戏…

企业电子印章主要通过以下几种方式进行防伪

企业电子印章主要通过以下几种方式进行防伪: 一、数字证书和加密技术 数字证书认证 企业电子印章依托数字证书,数字证书由权威的第三方数字认证机构颁发,确保了印章使用者的身份真实性。 数字证书如同企业在数字世界的身份证,包…

Python 工具库每日推荐 【sqlparse】

文章目录 引言SQL解析工具的重要性今日推荐:sqlparse工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:SQL查询分析器案例分析高级特性自定义格式化处理多个语句扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 Python工具库每日推荐 专…

SpringCloud-持久层框架MyBatis Plus的使用与原理详解

在现代微服务架构中,SpringCloud 是一个非常流行的解决方案。而在数据库操作层面,MyBatis Plus 作为 MyBatis 的增强工具,能够简化开发,提升效率,特别是在开发企业级应用和分布式系统时尤为有用。本文将详细介绍 MyBat…

我们是不是有点神话了OPENAI和CHATGPT?OPENAI真的Open?

网上很多人大力推荐和神化OPENAI的CHATGPT等产品,好像这神器无所不能!也不知道是VPN代理商为了给自己做广告?还是CHATGPT注册代理推销产品?或者有可能是国外宣传CHATGPT文章直接翻译过来的?不可否认CHATGPT确实是一款伟大的产品,但有些情况…

HarmonyOS的DevEcoStudio安装以及初步认识

目录 1.DevEco下载 2.DevEco安装 3. 未开启Hyper-V 1--开启Hyper-v流程 4.编译错误 5.目录结构 1)AppScope 2)entry: 3)build 4)entry->src 5)entry->src->main->etc 6)entry->src->main…

Shell编程-if和else

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们前面学习了那么多命令,以及涉及到部分逻辑判断的问题。从简单来说,他就是Shell编程,…

一键快捷回复软件助力客服高效沟通

双十一临近,电商大战一触即发!在这个购物狂欢的热潮中,客服团队的效率至关重要。今天我要和大家分享一个非常实用的快捷回复软件,特别是为电商客服小伙伴们准备的。这款软件能够极大地提高你的工作效率,让你在处理客户…

小程序开发设计-模板与配置:WXML模板语法⑨

上一篇文章导航: 小程序开发设计-协同工作和发布:协同工作⑧-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142455703?spm1001.2014.3001.5501 注:不同版本选项有所不同,并无大碍。 目录 上一篇文章导航&…

OpenAI 公布了其新 o1 模型家族的元提示(meta-prompt)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

开发板资源介绍【STM32MP157 学习笔记】

引言 FS-MP1A 开发板是基于 ST(意法半导体)公司的 STM32MP1 系列微处理器设计的先进开发板。该系列处理器集成了 Arm Cortex-A7 和 Cortex-M4 两种内核的异构架构,在高性能和灵活性的基础上,保证了低功耗、实时控制和高度集成化。…

阿里 C++面试,算法题没做出来,,,

我本人是非科班学 C 后端和嵌入式的。在我面试的过程中,竟然得到了阿里​ C 研发工程师的面试机会。因为,阿里主要是用 Java 比较多,C 的岗位比较少​,所以感觉这个机会还是挺难得的。 阿里 C 研发工程师面试考了我一道类似于快速…