深入解析面向对象编程(OOP)的三大核心特性:封装、继承与多态性

文章目录

    • 1. 封装:保护数据和隐藏实现细节
    • 2. 继承:提高代码复用性
    • 3. 多态:接口一致,实现多样

面向对象编程(Object-oriented programming,OOP)的三大特性——封装、继承和多态。

1. 封装:保护数据和隐藏实现细节

封装:隐藏对象的内部状态和行为实现细节,仅通过一个定义良好的接口与对象交互。

class Account:def __init__(self, owner, balance=0):self.owner = ownerself.__balance = balance  # 私有属性def deposit(self, amount):if amount > 0:self.__balance += amountprint("存款成功")def withdraw(self, amount):if 0 < amount <= self.__balance:self.__balance -= amountprint("取款成功")def get_balance(self):return self.__balance
  • 封装细节:私有属性 __balance 阻止了外部直接访问和修改账户余额,这保护了数据的完整性。
  • 公共接口:通过 depositwithdraw 方法提供的公共接口,允许在检查合法性的前提下进行交互,确保了操作的安全性。
  • 数据获取get_balance 方法提供了一种安全的方式来获取账户余额,而不允许直接访问内部数据。

补充:在属性名前使用双下划线 __使其变为私有,防止直接访问这些属性,从而实现封装。

2. 继承:提高代码复用性

继承允许一个类(子类)继承另一个类(父类)的属性和方法。这使得开发者可以建立一个层次化的类结构,提高代码的复用性,并使得代码结构更加清晰。

class Person:def __init__(self, name):self.name = namedef introduce(self):print(f"名字: {self.name}")class Student(Person):def __init__(self, name, school):super().__init__(name)self.school = schooldef introduce(self):super().introduce()print(f"学校: {self.school}")# 使用
student = Student("Alice", "MIT")
student.introduce()
  • 基类(Person):负责管理人的基本信息,如名字。
  • 派生类(Student):扩展了基类,增加了学校信息,并重写了 introduce 方法来包含学校信息。
  • 方法调用super().introduce() 在派生类中调用基类的 introduce 方法,确保了名字的正确介绍,并在其后添加了学校信息。

3. 多态:接口一致,实现多样

多态是指同一个接口可以被不同的对象以不同的方式实现。

class Animal:def speak(self):passclass Dog(Animal):def speak(self):print("Woof!")class Cat(Animal):def speak(self):print("Meow!")def animal_sound(animal):animal.speak()# 使用
dog = Dog()
cat = Cat()
animal_sound(dog)
animal_sound(cat)

Animal 类定义了一个 speak 方法,但没有具体实现。

DogCat 类继承了 Animal 并重写了 speak 方法以提供具体的实现。

animal_sound 函数演示了如何通过传递不同的对象来调用同一方法,这些对象表现出不同的行为。这就是多态的实质:相同的函数调用,根据传入的对象的类型,可以产生不同的行为。


推荐我的相关专栏: python 错误记录

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

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

相关文章

软件架构设计 Azure架构

软件架构 是指软件系统的组织结构&#xff0c;它定义了软件组件之间的关系、交互方式以及系统整体的设计原则和思想。在软件开发领域&#xff0c;有许多种不同类型的架构&#xff0c;其中一些常见的包括&#xff1a; 客户端-服务器架构&#xff08;Client-Server Architecture…

【spark】spark使用sql读取elasticsearch es索引,使用keystore配置用户密码

参考文章 spark配置elasticsearch属性汇总(基于es7) es-offical-doc Spark多方案读取Es性能比较 Spark读写ES数据时遇到的问题总结 es 查询多个索引的文档 spark table中使用明文密码 set es.index.auto.createtrue drop table if exists default.test_es01; create table d…

怎样选购内衣洗衣机?2024年5款最新推荐机型种草

随着科技的不断发展&#xff0c;内衣洗衣机成为了家家户户必备的小家电之一&#xff0c;为我们的生活带来了极大的便利。但面对市场上众多的内衣洗衣机品牌&#xff0c;如何选择一款质量好的内衣洗衣机呢&#xff1f;本文将为您推荐5款最新的内衣洗衣机品牌&#xff0c;从而帮助…

vue的优化手段

vue常见优化手段 使用key 对于通过循环生成的列表,应给每个列表项一个稳定且唯一的key,这有利于在列表变动时,尽量少的删除、新增、改动元素。 使用 index 作为 key 值,唯一但是不稳定。 一般情况下,应该选取 id 作为key值。 使用冻结对象 冻结的对象不会被响应化。…

二倍体毛白杨(Populus tomentosa Carr.)基因组-春天都是杨树毛子???-文献精读-11

High quality haplotype-resolved genome assemblies of Populus tomentosa Carr., a stabilized interspecific hybrid species widespread in Asia 高质量二倍体解析的毛白杨&#xff08;Populus tomentosa Carr.&#xff09;基因组组装&#xff0c;这是一种在亚洲广泛分布的…

SCSS的基本使用(一)

目录 一、使用&符号来引用父选择器 二、scss的语法 三、变量&#xff08;Variables&#xff09; 四、嵌套&#xff08;Nesting&#xff09; 五、mixin 和 include 六、extend 继承 七、import 与 Partials 八、if简单判断 九、if复杂判断 一、使用&符号来引用父…

【代码随想录】day46

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、139单词拆分 一、139单词拆分 完全想不到还能这么背包。。。 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {vec…

原型链prototype、__proto、constructor的那些问题整理

再了解原型链之前,我们先来看看构造函数和实例对象的打印结构 - 函数 这里我们定义一个构造函数Fn,然后打印它的结构吧 function Fn(){} console.dir(Fn)控制台得到结构 从上面结构我们能看的出来,函数有两种原型,一种是作为函数特有的原型:prototype,另一种是作为对象的__…

Redis深度解析与面试必备问答(必知必会20题全)

一、Redis简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value&…

Java设计模式 _结构型模式_适配器模式

一、适配器模式 **1、适配器模式&#xff08;Adapter Pattern&#xff09;**是一种结构型设计模式。适配器类用来作为两个不兼容的接口之间的桥梁&#xff0c;使得原本不兼容而不能一起工作的那些类可以一起工作。譬如&#xff1a;读卡器就是内存卡和笔记本之间的适配器。您将…

DataSource简单示例

javax.sql.DataSource是Java中用于管理数据库连接池的接口&#xff0c;它是javax.sql包中的一部分。DataSource接口提供了一种标准的方式来获取与数据库的连接&#xff0c;这样可以避免在每次需要连接数据库时都创建新的连接对象&#xff0c;从而提高了应用程序的性能和可伸缩性…

这样狠心的女人,不配当妈!

男人小时候经常受父亲虐待&#xff0c;初中毕业就到深圳打拼&#xff0c;基本与父母再无联系。 因为心有创伤&#xff0c;他没有考虑过结婚的事情&#xff0c;也不希望自己的娃成为受苦的一代。 然而&#xff0c;机缘巧合&#xff0c;他偶然之间认识了自己的爱人。 在妻子小的时…

意法半导体STM32F407VET6TR单片机优缺点、参数、应用和引脚封装

ST(意法半导体)的型号STM32F407VET6TR属于32位MCU微控制器&#xff0c;基于高性能的ArmCortex-M4 32位RISC核心&#xff0c;工作频率高达168MHz。单精度浮点单元(FPU)用于Cortex-M4核心&#xff0c;支持所有Arm单精度数据处理指令和数据类型。它还实现了一套完整的DSP指令和一个…

printjs打印表格的时候多页的时候第一页出现空白

现象&#xff1a;打印多页的时候第一页空白了&#xff0c;一页的时候没有问题 插件&#xff1a;printjs 网上搜索半天找到的方式解决&#xff1a; 1. 对于我这次的现象毫无作用。其他情况不得而知&#xff0c;未遇见过。&#xff08;这个应该是大家用的比较多的方式&#xf…

go中标签创建与引用

go中tag维护方法 util项目&#xff1a; 0 util修改的代码提交 1 从gitlab上获取最新的tag https://git.****.com/peiyou_like_shuangshi_zhongtai/beibo_utils/tags 2 创建tag: git tag -a v1.101.11 -m "its的ggb查询" 3 tagpush&#xff1a;git push origin v1.10…

[SpringBoot] JWT令牌——登录校验

JWT&#xff08;JSON Web Token&#xff09;是一种用于在网络应用之间传递信息的开放标准&#xff08;RFC 7519&#xff09;。它由三部分组成&#xff1a;头部&#xff08;header&#xff09;、载荷&#xff08;payload&#xff09;和签名&#xff08;signature&#xff09;。J…

Mybatis-plus 字段结果为NULL

问题 Mybatis-plus 字段结果为NULL 详细问题 笔者使用SpringBootMybatis-plus 进行项目开发。进行接口请求测试&#xff0c;在确定SQL语句没有问题的前提下&#xff0c;返回记录部分字段(譬如字段name)为空。 解决方案 修改Mybatis-plus中mapper的xml文件&#xff0c;使re…

JavaEE初阶——多线程(七)——定时器

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第七篇文章——关于定时器 如果有不足的或者错误的请您指出! 目录 4.定时器4.1标准库提供的定时器4.2自己实现一个定时器4.2.1任务类4.2.2Timer类4.2.3 有一个线程来负…

1015: 【C1】【循环】【for】整数序列的元素最大跨度值

题目描述 给定一个长度为n的非负整数序列&#xff0c;请计算序列的最大跨度值&#xff08;最大跨度值 最大值减去最小值&#xff09;。 输入 一共2行&#xff0c;第一行为序列的个数n&#xff08;1 < n < 1000)&#xff0c;第二行为序列的n个不超过1000的非负整数&am…

如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题

&#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e; 文章目录 &#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e;摘要引言正文&#x1f4d8; 识别问题&#x1f4d9; 内存配置调整步骤1: 定位vmoptions文件步骤2: 修改…