Python 封装、继承和多态

news2024/9/23 15:28:26

在学习 Python 这门编程语言时,你会接触到一些重要的面向对象编程(OOP)概念,比如封装、继承和多态。这些概念不仅是 Python 的核心特性,也是理解和使用高级编程技巧的基础。本文将通俗易懂地解释这些概念,特别适合新手学习者。

在这里插入图片描述

一、封装

1.1 封装的概念

封装是指将数据(属性)和操作数据的方法(函数)结合在一起,形成一个“对象”。在 Python 中,封装的主要目的是保护对象的内部状态,确保这些状态只能通过特定的方法进行访问和修改。这种方式可以降低程序的复杂性,提高代码的可维护性。

例如,假设我们有一个 BankAccount 类,用于表示银行账户。我们希望只有通过特定的方法才能访问和修改账户余额,以防止不当操作。

class BankAccount:
    def __init__(self, initial_balance=0):
        self.__balance = initial_balance  # 使用双下划线表示私有属性

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"Deposited: {amount}, New Balance: {self.__balance}")

    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
            print(f"Withdrew: {amount}, New Balance: {self.__balance}")
        else:
            print("Insufficient funds or invalid amount.")

    def get_balance(self):
        return self.__balance

在这个例子中,__balance 是一个私有属性,外部代码无法直接访问。我们通过 depositwithdrawget_balance 方法来操作这个属性。

1.2 封装的好处

  1. 数据保护:封装可以防止外部代码直接修改对象的内部状态,增加了安全性。
  2. 代码可读性:外部代码只需关心如何使用对象的方法,而不需要了解内部实现。
  3. 易于维护:如果我们需要修改内部实现,只需保证方法接口不变,外部调用不受影响。

二、方法重写

2.1 什么是方法重写?

方法重写是指在子类中重新定义父类的方法,以改变或扩展其功能。在 Python 中,子类可以继承父类的属性和方法,并根据具体需求对其进行修改。

2.2 方法重写的示例

考虑一个简单的动物类 Animal 和它的子类 DogCat。我们希望它们都有一个 sound 方法,但不同的动物发出不同的声音。

class Animal:
    def sound(self):
        return "Some generic sound"

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

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

在这个例子中,DogCat 类重写了 Animal 类的 sound 方法。当我们调用这些方法时,返回的结果将是不同的。

2.3 方法重写的好处

  1. 灵活性:允许子类根据特定需求修改父类的方法行为。
  2. 可扩展性:当需要添加新功能时,可以通过继承和重写轻松实现。
  3. 代码复用:通过继承,子类可以重用父类的代码,同时实现特定行为。

三、多重继承

3.1 什么是多重继承?

多重继承指的是一个类可以同时继承多个父类的特性。在 Python 中,多重继承是合法的,这使得代码的复用性更强。但同时,使用多重继承时也要小心,因为它可能导致复杂性和潜在的冲突。

3.2 多重继承的实现

下面是一个简单的多重继承示例。我们将创建两个类 FlyableSwimmable,然后创建一个类 Duck,它同时继承这两个类。

class Flyable:
    def fly(self):
        return "I can fly!"

class Swimmable:
    def swim(self):
        return "I can swim!"

class Duck(Flyable, Swimmable):
    def quack(self):
        return "Quack!"

在这个例子中,Duck 类同时继承了 FlyableSwimmable 的功能。我们可以通过 Duck 类的实例调用 flyswim 方法。

3.3 多重继承的注意事项

  1. 菱形继承问题:如果多个父类有相同的方法,可能会导致方法调用的混淆。Python 使用一种叫做 “方法解析顺序”(MRO) 的机制来解决这个问题。
  2. 复杂性:多重继承可能使代码变得复杂,增加理解和维护的难度。因此,建议在确实需要时使用。

3.4 示例:菱形继承

下面是一个简单的菱形继承示例:

class A:
    def method(self):
        return "Method from A"

class B(A):
    def method(self):
        return "Method from B"

class C(A):
    def method(self):
        return "Method from C"

class D(B, C):
    pass

d = D()
print(d.method())  # 输出将依赖于 MRO

在这个例子中,D 类同时继承了 BC,而 BC 又都继承了 A。调用 d.method() 时,Python 会根据 MRO 规则决定调用哪个方法。

四、总结

在这篇文章中,我们详细探讨了 Python 中的封装、方法重写和多重继承。这些概念是面向对象编程的基石,有助于提高代码的可读性、可维护性和复用性。

  • 封装 保护了对象的内部状态,确保其只能通过特定的方法进行访问和修改。
  • 方法重写 允许子类根据特定需求修改父类的方法行为,提供了灵活性和可扩展性。
  • 多重继承 使得一个类可以同时继承多个父类的特性,但需要小心使用,以避免复杂性和方法冲突。

希望通过这篇文章,你对 Python 的封装、继承和多态有了清晰的理解,能够在实际编程中灵活运用这些概念。

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

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

相关文章

MVC设计模式与delegate,tablview,Appdelegate,SceneDelegate

一、MVC MVC就是Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09; 例如上面的 excel表&#xff0c; 数据、数据结构就是模型Model 根据数据形成的直观的、用户能直接看见的柱形图是视图View 数据构成的表格…

Linux网络——socket编程与UDP实现服务器与客户机通信

文章目录 端口号TCP/UDP网络字节序socket的常见APIUDP实现服务器与客户机通信服务器客户机运行效果如下 端口号 我们说即便是计算机网络&#xff0c;他们之间的通信也仍然是进程间通信 那么要如何在这么多计算机中&#xff0c;找到你想要的那个进程呢 在网络中标识的唯一的计…

反激电路的参数设计,基于TI-UC3843芯片,Simplis仿真验证

采用TI官方提供的UC3843芯片手册给的DEMO图&#xff0c;通过MATHCAD计算参数得出环路补偿的各项参数&#xff0c;最后使用simplis进行仿真验证&#xff0c;一起进行学习吧。 UCx84x 电流模式 PWM 控制器 datasheet (Rev. G) (semiee.com) UCx84x 系列控制集成电路提供了实现离…

【springboot过ingress后无法获取X-Forwarded-For头信息】

springboot过ingress后无法获取X-Forwarded-For头信息 一、现象结论修改步骤ingressspringboot 排查流程本文参考 一、现象 项目使用spring boot 2.7.18&#xff0c;有个新需求是校验X-Forwarded-For头的所有来源ip合法性&#xff0c;线上环境出现取不到X-Forwarded-For头的问…

【思博伦】史上最详细思博伦测试仪使用精讲!图解超赞超详细!!!

承接上文 目录 2.2.9.7 配置TCPFLAG 2.2.9.8 配置分片 2.2.9.9 添加VLAN标签 2.2.9.10 添加MPLS标签 2.2.9.11 添加Vntag标签 2.2.9.12 重新快速新建新的帧内容 ​​​​​​​2.2.10 导入Pcap包 2.2.11 发包配置 2.2.11.1 发包模式配置 ​​​​​​​2.2.11.2 配置…

【OJ】关于顺序表的经典题目(移除数组中指定元素的值、数组去重、合并两个有序的数组)

文章目录 前言题目1&#xff1a;移除数组中指定的元素题目描述解题思路方法1 &#xff1a;暴力法方法2&#xff1a;双指针法 题目2&#xff1a;数组去重题目描述解题思路双指针法 题目3&#xff1a;合并两个有序的数组题目描述解题思路方法1&#xff1a;暴力破解法方法2&#x…

SAP F110 批量付款付款参考(KIDNO)和分配字段(ZUONR)带入会计凭证

SAP F110 批量付款付款参考(KIDNO)和分配字段(ZUNOR)带入会计凭证 财务有个要求需要将付款建议的付款参考和分配字段写入最后的ZP凭证 最后的效果大概就是这样的 折腾了很久, 1、先是想到的GGB1的替代,但是试验了很久都没有搞定,貌似很多人遇到了这个情况。 2、然后…

初识爬虫4

1.理解代理ip&#xff0c;正向代理和反向代理 2.代理ip分类&#xff0c;根据匿名度分类&#xff1a;透明&#xff0c;匿名&#xff0c;高匿 3.防止频繁向同一个域名发送请求被封ip,需使用代理ip # -*- coding: utf-8 -*- import requestsurl https://www.baidu.comproxies {…

Facebook如何通过AI改变你的社交体验?

在当今数字化的社交媒体环境中&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;正在通过引入和优化人工智能&#xff08;AI&#xff09;技术&#xff0c;改变用户的社交体验。人工智能不仅帮助Facebook增强了内容推荐和信息过滤的精准度&#xff0c;还让平台具备了…

故障恢复(残次版)

视频地址 一&#xff1a;文件系统故障修复案例 模拟搞坏磁盘中的某一块 dd if/dev/zero of/dev/sdb1 bs1k count10(默认4K)1.修补分区中每个组中坏掉的超级块部分 查看超级块的备份块 dumpe2fs 磁盘位置 如&#xff1a; dumpe2fs /dev/sdb1使用备份超级块进行修复&#x…

Netty笔记01-Netty的基本概念与用法

文章目录 1. 概述1.1 Netty 是什么&#xff1f;1.2 Netty 的特点1.3 Netty 的作者1.4 Netty 的地位1.5 Netty 的优势1.6 Netty 的工作原理1.7 Netty 的应用场景1.8 Netty 的重要组件 2. 第一个程序2.1 目标2.2 服务器端2.3 客户端2.4 流程梳理&#x1f4a1; 提示 1. 概述 1.1 …

【香菇的程序人生】七夕舔狗反诈指南:技术篇

本文设计技术分析及部分参考网站仅供技术研究及自我保护&#xff0c;请勿用于其他用途&#xff01; 另外&#xff0c;为什么本文只针对"舔狗"呢?因为舔狗不愿面对事实&#xff0c;本文将从科学技术角度给其指点迷津~ 文章目录 1. 你的女神/男神保熟吗1.1 AI 换脸请谨…

关于ADC单次扫描和连续扫描的操作指导(STM32F103ZET6正点原子版)作者 江汉大学 计科224尹伦能

STM32CubeMX环境配置 1 ADC1配置 选中ADC1&#xff0c;然后勾选IN0&#xff0c;其余设置均默认不变&#xff08;此为单次扫描&#xff0c;若是连续扫描&#xff0c;只需要将上图中的Continuous Conversion Mode由Disabled变为Enabled即可&#xff09;。 2 RCC及时钟配置 选中…

分析 ECharts 图表渲染导致的内存泄漏问题 - 附解决方案

一. 引言 在今年某个可视化大屏项目中&#xff0c;出现了一个问题。项目在运行一段时间后&#xff0c;页面出现了崩溃&#xff0c;而且是大概运行几天之后&#xff0c;因为大屏项目是部署到客户现场大屏&#xff0c;长时间运行不关闭。报错问题如下图所示&#xff1a; 由于这个…

重磅发布!DeepSeek-V2.5:融合通用与代码能力的全新开源模型

前沿科技速递&#x1f680; 在人工智能飞速发展的今天&#xff0c;通用对话与代码生成的融合已经成为开发者高效工作的关键工具。近日&#xff0c;DeepSeek 团队正式发布了全新的 DeepSeek-V2.5 模型&#xff0c;一个强大的开源模型&#xff0c;它将通用语言处理与代码生成能力…

Python爱心射线

系列目录 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…

高效录屏攻略:电脑视频录制时声音同步捕获技巧,轻松搞定高清音质

在当今数字化时代&#xff0c;无论是在线教育、远程工作还是内容创作&#xff0c;录制视频已经成为我们生活中不可或缺的一部分。但是&#xff0c;很多人在录制视频时都会遇到一个问题&#xff1a;如何同时录制声音&#xff1f;如果你也在为此烦恼&#xff0c;那么这篇文章将为…

OpenCV通过鼠标提前ROI(C++实现)

文章目录 鼠标绘制矩形提取ROI任意形状绘制提前ROI 废话不多说&#xff0c;直接上代码 鼠标绘制矩形提取ROI #include <iostream> #include <opencv2\opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/core.hpp>us…

算法_优先级队列---持续更新

文章目录 前言最后一块石头重量题目要求题目解析代码如下 数据流中的第K大元素题目要求题目解析代码如下 前K个高频单词题目要求题目解析代码如下 数据流的中位数题目要求题目解析代码如下 前言 本文将会向你分享优先级队列相关的题目&#xff1a;最后一块石头重量、数据流中的…

【运维自动化-作业平台】脚本版本管理如何使用

在蓝鲸作业平台中&#xff0c;执行脚本是最常见的功能之一&#xff0c;支持快速录入脚本执行和引用脚本执行&#xff0c;引用的脚步即单独写好的&#xff0c;并且由定期管理更新的脚本&#xff0c;主要有业务脚本和公共脚本两种。快速脚本 手动页面编写的脚本&#xff0c;没有…