7.2 继承与多态:Python 面向对象编程的魔法

news2024/9/28 13:19:42

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:
工💗重💗hao💗:野老杂谈
⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.
⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。
⭐️ 全流程数据技术实战指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台和数据仓库的核心技术和方法。
⭐️ 构建全面的数据指标体系:通过深入的理论解析、详细的实操步骤和丰富的案例分析,为读者提供系统化的指导,帮助他们构建和应用数据指标体系,提升数据驱动的决策水平。
⭐️《遇见Python:初识、了解与热恋》 :涵盖了Python学习的基础知识、进阶技巧和实际应用案例,帮助读者从零开始逐步掌握Python的各个方面,并最终能够进行项目开发和解决实际问题。

摘要

继承和多态是面向对象编程(OOP)的两大重要概念。本文将以幽默和故事的形式,深入浅出地介绍继承与多态的原理及其在 Python 中的实现。通过丰富的代码示例和图表示例,帮助读者全面掌握这两个关键概念,提升编程技能。

标签: Python、面向对象编程、继承、多态、编程技巧


什么是继承?

在编程的世界里,继承就像是家庭中的遗传。我们从父母那里继承了许多特征,同样,类也可以从另一个类继承属性和方法。

故事:动物园的新成员

想象一下,你是一个动物园管理员,你需要管理各种动物。首先,你有一个动物的基类 Animal,它有一些通用的属性和方法。

class Animal:
    def __init__(self, name, species):
        self.name = name
        self.species = species

    def make_sound(self):
        raise NotImplementedError("Subclasses must implement this method")

    def move(self):
        print(f"{self.name} the {self.species} moves around.")

继承的基本用法

继承让我们可以创建一个新类,这个新类不仅有自己的属性和方法,还继承了父类的属性和方法。

定义子类

我们可以定义一个 Dog 类,继承自 Animal 类。

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name, "Dog")
        self.breed = breed

    def make_sound(self):
        print(f"{self.name} the {self.breed} says: Woof!")
创建对象

现在,我们可以创建一个 Dog 对象,它既有 Animal 的属性和方法,也有自己的特性。

dog1 = Dog("Buddy", "Golden Retriever")
dog1.make_sound()  # 输出: Buddy the Golden Retriever says: Woof!
dog1.move()  # 输出: Buddy the Dog moves around.

方法重写与扩展

当子类继承父类的方法时,它可以选择重写这些方法,以提供特定的实现。子类还可以扩展父类的方法。

方法重写

重写父类的方法是指在子类中定义一个与父类方法同名的方法,从而覆盖父类的方法。

class Cat(Animal):
    def make_sound(self):
        print(f"{self.name} the {self.species} says: Meow!")
方法扩展

子类可以调用父类的方法,并在此基础上添加自己的行为。

class Bird(Animal):
    def __init__(self, name, species, can_fly):
        super().__init__(name, species)
        self.can_fly = can_fly

    def move(self):
        super().move()
        if self.can_fly:
            print(f"{self.name} the {self.species} flies away!")
bird1 = Bird("Tweety", "Canary", True)
bird1.move()  # 输出: Tweety the Canary moves around. Tweety the Canary flies away!

多重继承

Python 支持多重继承,即一个类可以继承多个父类。这种特性在设计复杂的类结构时非常有用。

定义多重继承

让我们定义一个会游泳和会飞的动物。

class Swimmer:
    def swim(self):
        print("Swimming...")

class Flyer:
    def fly(self):
        print("Flying...")

class Duck(Animal, Swimmer, Flyer):
    def __init__(self, name):
        super().__init__(name, "Duck")

    def make_sound(self):
        print(f"{self.name} the Duck says: Quack!")
创建对象
duck1 = Duck("Donald")
duck1.make_sound()  # 输出: Donald the Duck says: Quack!
duck1.move()  # 输出: Donald the Duck moves around.
duck1.swim()  # 输出: Swimming...
duck1.fly()  # 输出: Flying...

什么是多态?

多态性是指在不改变对象接口的前提下,使用不同的对象实现不同的行为。简单来说,不同对象可以通过同样的接口调用不同的方法。

多态性的例子
def animal_sound(animal):
    animal.make_sound()

dog = Dog("Buddy", "Golden Retriever")
cat = Cat("Whiskers")

animal_sound(dog)  # 输出: Buddy the Golden Retriever says: Woof!
animal_sound(cat)  # 输出: Whiskers the Cat says: Meow!

接口与实现

多态性通常与接口和实现相关。在 Python 中,接口可以通过定义抽象基类实现。

抽象基类

Python 提供了 abc 模块,可以用来定义抽象基类。

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def make_sound(self):
        pass
实现抽象基类

子类必须实现抽象基类中的所有抽象方法。

class Dog(Animal):
    def make_sound(self):
        print("Woof!")

class Cat(Animal):
    def make_sound(self):
        print("Meow!")
dog = Dog()
cat = Cat()

dog.make_sound()  # 输出: Woof!
cat.make_sound()  # 输出: Meow!

实战演练——创建一个简单的图形系统

通过一个实际案例,进一步理解继承与多态的应用。

案例:简单的图形系统
  1. 定义图形基类
  2. 定义具体图形类
  3. 实现绘图逻辑
class Shape(ABC):
    @abstractmethod
    def draw(self):
        pass

class Circle(Shape):
    def draw(self):
        print("Drawing a Circle")

class Square(Shape):
    def draw(self):
        print("Drawing a Square")

# 绘图逻辑
def draw_shape(shape):
    shape.draw()

circle = Circle()
square = Square()

draw_shape(circle)  # 输出: Drawing a Circle
draw_shape(square)  # 输出: Drawing a Square

总结——继承与多态的魔力

通过本文的讲解,我们了解了 Python 中继承与多态的基本概念、定义和使用方法,并通过实际案例体验了它们的强大与灵活性。

希望你能通过本文掌握继承与多态的使用,并在实际编程中灵活运用它们。记住,面向对象编程就像魔法,让编程变得更加有趣和高效。继续探索吧,Python 的世界还有更多神奇的内容等着你!

在这里插入图片描述

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

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

相关文章

idea中怎么使用git把项目提交到远程仓库

git的版本控制 在gitignore中添加这些文件 可以在与远程仓库进行操作的时候 忽略掉这些文件夹 使用Git进行项目代码的版本控制,具体操作: 1). 创建Git本地仓库 当Idea中VS变成Git(G): 说明本地仓库创建成功。 2). 创建Git远程仓库 1、gi…

Deep-Live-Cam:只需单张图像即可实现人脸替换;零一万物、月之暗面再掀国产大模型资本战丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

萤石开放平台开发票流程

若您已经在开放平台完成充值,可通过以下方式自助开票 一、PC端开票 进入开放平台首页,登入账号,进入价格页面,点击首页右下方的“开票指引”入口 二、萤石云视频APP 萤石云APP:底部导航栏“我的”——点击“订单”…

如何编写一个有效的OKR(带有示例)

客户经常问我们的一个问题是:”我如何写出有效的目标和关键结果? 我如何写出有效的目标和关键结果? 一开始,要弄清楚不同的要素是很困难的,而且有这么多的指导和风格,你很难知道自己是否做对了。 在这篇…

【Nacos无压力源码领读】(三) Nacos 配置中心与热更新原理详解 敢说全网最细

本文将从 Nacos 配置中心的基本使用入手, 详细介绍 Nacos 客户端发布配置, 拉取配置, 订阅配置的过程以及服务器对应的处理过程; 配置订阅以及热更新原理相关的部分, 我看了主流的博客网站, 绝对没有比这更详细的讲解; 如果在阅读过程中对文中提到的 SpringBoot 启动过程以及…

k8s 与 docker 安装 Syncthing 文件同步服务器

Syncthing是一个开源文件同步工具,可以在多台设备之间实时同步文件或文件夹,官方网站:https://syncthing.net/ 下载地址:https://syncthing.net/downloads/ ,如果是windows一般推荐下载图形界面SyncTrayzor, 但我这边都…

视频循环存储的实现

目录 1. 三方工具 2. 视频存储的实现 2.1 分段存储 - 比如每15分钟 2.2 对齐到15分钟整边界 2.3 循环存储的实现 video_space_daemon.sh 3.封装 3.1 主执行程序,修订版 3.2 创建服务 3.3 service关联的执行脚本文件 4.额外的工作 附录A: ffmpeg视频存储…

中电金信三步法全面助力银行数字化营销体系建设

存量用户竞争时代 精细化经营、个性化服务与多场景覆盖 成为银行经营的重要策略 营销数字化转型不可或缺 但是,与所有转型的曲折、阵痛等特征一样,银行构建数字化营销运营体系过程中,亦走过一些弯路,包括: 缺少顶层…

收银系统源码-连锁店版本

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 私有化独立部署/全开源源码,系统开发语言: 核心开发语言: PHP、HTML…

【漏洞复现】某赛通电子文档安全管理系统 PolicyAjax SQL注入漏洞

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

医药行业如何对内部机密数据进行加密保护?

一、医药行业加密解决方案 1、药品研发过程中加密保护重要数据,防止信息泄露 考虑到药品研发部门数据安全重要性高,且与其他部门较少业务关系往来,为防止公司研发配方泄密到其他部门或者公司外,研发部门实行权限控制。做到研发部…

JESD204B/C协议学习笔记

JESD204B基础概念 204B包含传输层,链路层,物理层。 应用层是对 JESD204B 进行配置的接口,在标准协议中是不含此层,只是为了便于理解,添加的一个层。 协议层指工程中生成的IP核JESD204B,负责处理输入的用户…

pod详解 list-watch机制 预选优选策略 如何指定节点调度pod

K8S是通过 list-watch 机制实现每个组件的协同工作 controller-manager、scheduler、kubelet 通过 list-watch 机制监听 apiserver 发出的事件,apiserver 也会监听 etcd 发出的事件 scheduler的调度策略: 预选策略(Predicates)…

JavaScript中的__setitem__方法

1、问题背景 Python中存在一个名为__setitem__的方法,该方法能够在向对象中设置值时对其进行处理。例如,以下代码演示了如何在Python中使用__setitem__方法对一个字典中的键值对进行平方处理: class CustomDict(dict):def __setitem__(self…

PMP证书3A一次通过攻略(内含血泪教训和踩过的坑,避雷必看)

手把手教你如何3A速通PMP证书 首先:你考PMP到底图什么? 清晰、强烈的动机是意志力的基础,你是想要加薪升职?转行转岗?还是只是为了知识?无论什么理由都可以,当搞明白到底图什么,学习…

URDF在线可视化网站

​ URDF全称(United Robotics Description Format)统一机器人描述格式,是一个XML语法框架下用来描述机器人的语言格式,URDF在ROS界很流行。 关于URDF的详细介绍,请参考博文URDF学习(一)什么是U…

海康gige工业相机无驱动取像突破(c#实现,版本更新,你也可以移植到linux下去用)

我们前面有一个版本,没有整理,只能是500万海康gige工业相机无驱动取像成功(黑白相机gm)。 这里,版本更新了,可以不是500万,200万,80万也可以,你可以去试一试&#xff0c…

【C++二分查找 树状数组】2424. 最长上传前缀

本文涉及的基础知识点 C二分查找 树状数组 LeetCode2424. 最长上传前缀 给你一个 n 个视频的上传序列,每个视频编号为 1 到 n 之间的 不同 数字,你需要依次将这些视频上传到服务器。请你实现一个数据结构,在上传的过程中计算 最长上传前缀…

“AI+Security”系列第2期(一):对抗!大模型自身安全的攻防博弈

近日,由安全极客、Wisemodel 社区和 InForSec 网络安全研究国际学术论坛联合主办的“AISecurity”系列第 2 期——对抗!大模型自身安全的攻防博弈线上活动如期举行。本次活动邀请了君同未来创始人兼 CEO 韩蒙、前阿里云高级安全专家郑瀚、ChaMd5 AI 组负…

浏览器突然无法正常访问网页的解决方案

文章目录 1.问题描述:2.解决方案3.总结 1.问题描述: 浏览器之前是可以正常搜索的,但是这次打开显示无法正常访问,但是部分网页又是可以正常访问的 2.解决方案 1.搜索控制面板 2.点击网络和Internet 3.点击网络共享中心 4.点击…