21、Python之面向对象:一切皆对象,可你真的需要面向对象吗

引言

面向对象(Object-Oriented Programming, OOP)和面向过程(Procedural Programming)是两种不同的编程范式。不能因为我们接下来要进入“面向对象”的模块的学习,就武断地说,面向对象一定比面向过程好。两者都有各自的适用场景,只能说哪种场景更适合哪种范式而已。

本文将对面向对象的核心理念,面向对象的基本概念做一些介绍,为后续面向对象的学习打下一个观念上的基础。

为什么需要面向对象

就日常的数据处理任务来说,面向过程的范式,更加适合,而且把任务按照处理的流程,分步骤实现,每个步骤单独定义对应的处理函数,更加清晰且易于理解。尤其在涉及到算法实现时,面向过程编程更可以清晰地表达算法的步骤和逻辑。

然而,当任务比较复杂时,我们会发现,通过面向过程的范式进行编程时,需要使用大量的全局变量和函数间的参数和返回值进行交互中间数据的传递,整个代码表达上会变得很繁琐,反而使程序不那么清晰了。这时候,面向对象的编程范式就更加适用了。

此外,从更本质上来看,两种编程范式进行上推,其实是所在系统分析与设计的范式的不同。面向过程的需求分析、系统设计,是以数据、流程为核心的。而面向对象是以实体的抽象为核心的。

面向对象的核心理念

只要稍微了解过面向对象,大概都会清楚,面向对象有三大核心理念,也就是:封装、继承和多态。

1、封装

首先是封装,在面向过程范式中,数据表达和数据处理是相分离的,数据表达一般是通过全局变量的形式实现,数据的处理是通过自定义函数的形式实现。处理逻辑如果很复杂的话,全局变量和函数之间的相互关联关系将变得不那么直观,代码的可读性也变得越来越差。

而在面向对象中,数据的表达和数据的处理被放到了一个叫做对象的实体中。数据作为对象的属性存储,数据的处理作为对象中的方法来实现。同一个对象的所有方法可以随时访问对象中的属性,而不需要通过参数传递的方式来进行。

此外,相较于全局变量的方式进行数据的共享,面向对象的封装,通过属性进行数据的共享,变得相对安全一些,不必但系全局变量被其他函数误操作了(随着,这种安全性也更多是一种设计理念上的约定的存在,而非绝对的安全)。

2、继承

面向过程的编程中,功能的复用,可以通过函数的调用实现,这种复用关系,其实是相对松散一些的。复用的形式比较直接、易于掌握。

而面向对象中,通过继承,子类可以自动复用父类中的属性和方法,复用关系比面向过程中更加紧密,但又更加自然。

3、多态

多态的理念,更多的其实是可扩展性的体现。面线过程中,要实现可扩展,要改动的地方会比较多,一般通过增加分支判断,来进行扩展功能的引入。

而面向对象中,变得相对简单。扩展功能的引入,通过定义新的子类或者新的实现特定接口协议的类,在调用方的代码无需做任何修改。

此外,相较于静态类型的编程语言,Python这种动态类型的语言的多态实现,变得更加灵活、自然。

面向对象的基本概念

除了前面提到的面向对象的三大核心理念外,面向对象中还有几个基本概念,需要提前在脑子里留个印象。

1、类(Class)

类可以理解为是对象的模板、蓝图,类中定义了对象需要的属性和方法。

2、对象(Object)

对象这个概念,任何一个学习、使用Python的人,都可能是“日用而不知”的。对象是类的实例,具有类中定义的属性和方法,是数据的表达和数据的处理的封装实体。

3、属性(Attribute)

对象中的属性,类似于变量的存在,用以存储对象实例的状态。

4、方法(Method)

类中定义的数据处理的方法,定义了对象应该具有的行为。

面向对象的举例

我们以一个产研团队进行产品的设计研发为例,简单对比一下面向过程与面向对象的使用上的区别。

1、小的研发团队,只有三个人:产品经理、前端开发、后端开发

面向过程的团队工作:

# 假如我们现在有一个三人团队:产品经理、前端开发、后端开发
# 面向过程的产品研发
team = [{'name': '狗子', 'duty': 'PM'},{'name': '小花', 'duty': 'FRD'},{'name': '光头', 'duty': 'BRD'},
]def product_design(name):print(f"产品经理【{name}】进行产品设计")def frontend_coding(name):print(f"前端开发【{name}】进行前端开发")def backend_coding(name):print(f"后端开发【{name}】进行后端开发")def team_work(workers):for dgr in workers:if dgr['duty'] == 'PM':product_design(dgr['name'])continueif dgr['duty'] == 'FRD':frontend_coding(dgr['name'])continueif dgr['duty'] == 'BRD':backend_coding(dgr['name'])continueelse:print('你是哪里冒出来的')if __name__ == '__main__':team_work(team)

执行结果:

e106df8456ca9d3b27f8b7f68da02e73.jpeg

面向对象的团队工作:

# 假如我们现在有一个三人团队:产品经理、前端开发、后端开发
# 面向对象的产品研发class DaGongRen(object):def __init__(self, name):self.name = namedef work(self):passclass ProductManager(DaGongRen):def work(self):print(f"产品经理【{self.name}】进行产品设计")class FrontendProgrammer(DaGongRen):def work(self):print(f"前端开发【{self.name}】进行前端开发")class BackendProgrammer(DaGongRen):def work(self):print(f"后端开发【{self.name}】进行后端开发")team = [ProductManager('狗子'), FrontendProgrammer('小花'), BackendProgrammer('光头')]def team_work(workers):for dgr in workers:dgr.work()if __name__ == '__main__':team_work(team)

执行结果:

3a30b06e7953af4cdb65e1254d9039cd.jpeg

2、现在团队经费足够了,可以夸大团队规模了,我们增加了测试工程师

面向过程的代码有一处新增、两处修改:

5a0d35a90ba674f9a42454e790191882.jpeg

执行结果:

804c41101b4527b5bc2c2a901cdb240c.jpeg

面向对象的代码有一处新增、一处修改:

c2d5142274e595950023674c8815ba71.jpeg

执行结果:

ad6e72924c8d05896dea51c2a2cdf944.jpeg

通过前面的代码示例,应该能够稍微理解面向对象与面向过程的异同。

此外,关于代码的可扩展性,也能理解何为面向对象扩展功能时,调用方不需要修改代码的好处了。

如何学习面向对象

对于新手来说,面向对象是一种新的编程范式、新的设计理念。

学习面向对象的核心在于对这种新的设计理念的三个核心理念的理解、消化。而不是对相关的语法的填鸭式记忆。

实际编程实践中,没有必要为了面向对象而面向对象。

可以试着从数据的表达和数据的处理的封装特性作为体悟面向对象这种思想的一个落脚点,然后不断实践,从实践中加深对面向对象的理解。

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

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

相关文章

若依 ruoyi poi Excel合并行的导入

本文仅针对文字相关的合并做了处理 ,图片合并及保存需要另做处理!! 目标:Excel合并行内容的导入 结果: 1. ExcelUtil.java 类,新增方法:判断是否是合并行 /*** 新增 合并行相关代码:…

【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

计网_数据通信基础知识

2024.07.05:计算机网络数据通信基础知识学习笔记 第2节 数据通信基础知识 2.1 物理层特性(学会区分)2.2 信道相关的基本概念2.2.1 数字信号的(基带调制)(1)不归零NRZ编码(2&#xff…

1207. 有趣的数字图形IV

问题描述 输入一个整数 𝑛 ( 𝑛≤12 ),打印出如下要求的方阵: 除掉右上到左下对角线上的数外的右下半个区域中每个元素等于左边的和上面的元素之和。每个元素场宽为 5 。左上半个区域为空。 输入 一个整…

C语言------指针讲解(3)

一、字符指针 在指针中,我们知道有一类指针类型为字符指针char*; int main() {char ch w;char* pc &ch;*pc w;return 0; } 还有一种使用方式如下: 上述代码中,本质是把hello的首字符的地址放到了pstr中。即把一个常量字符串的首字符…

C++图书管理系统

目录 实现功能 用户管理 图书管理 借阅与归还 未归还图书 部分效果图 结构体 Book 结构体 User 结构体 源代码 编译时在连接器命令行加入 完整代码 实现功能 用户管理 添加用户:输入用户ID、用户名和密码…

【LeetCode】71.简化路径

1. 题目 2. 分析 3. 代码 我写了一版很复杂的代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:operator [] # 操作符的栈dir_name [] # 文件名的栈idx 0cur_dir_name ""while(idx < len(path)):if path[idx] /:operator.ap…

AI绘画入门实践|Midjourney:使用 --seed 制作情侣头像与漫画

在 Midjourney 中&#xff0c;seed 是指一个种子&#xff0c;用于生成图像时的起点或基础。 使用格式&#xff1a;--seed 获取的seed值 获取 seed 值 使用 seed 生成图像 a cute boys avatar, background with blue sky and white cloud, Ghibli Studio style, Hayao Miyazaki…

智能爬虫管理:定制化数据抓取方案为企业赋能

摘要&#xff1a; 在数据驱动的时代&#xff0c;精准而高效的数据抓取成为企业决策的命脉。本文将探讨如何通过定制化的智能爬虫管理方案&#xff0c;赋能企业实现数据洞察力的飞跃。我们将深入解析定制化数据抓取的核心优势&#xff0c;分享成功案例&#xff0c;并揭秘如何利…

InteliJ IDEA最新2024版下载安装与快速配置激活使用教程+jdk下载配置

第一步&#xff1a;下载ideaIC-2024.1.4 方法1&#xff1a;在线链接 IntelliJ IDEA – the Leading Java and Kotlin IDE (jetbrains.com) 选择社区版进行下载 方法2&#xff1a;百度网盘 链接&#xff1a;https://pan.baidu.com/s/1ydS6krUX6eE_AdW4uGV_6w?pwdsbfm 提取…

vue3+g2plot实现词云图

词云图 效果预览: 核心代码: import {WordCloud } from @antv/g2plot;fetch(https://gw.alipayobjects.com/os/antfincdn/jPKbal7r9r/mock.json).then((res) => res.json()).then((data) => {const wordCloud = new WordCloud(container, {data,wordField: x,weigh…

电场、磁场、麦克斯韦方程组

电场和磁场 电场和磁场并不是一个虚拟的概念&#xff0c;而是一种确实存在的物质。法拉第提出了电场和磁场&#xff0c;法拉第认为之所以两个电荷之间有力的作用,是因为有一个电荷会在周围空间产生一种物质,这种物质叫做电场。法拉第提出&#xff1a;电场是由电荷产生的。之后人…

【笔记:3D航路规划算法】二、RRT*

目录 一、RRT*于RRT的不同之处1、路径优化&#xff1a;2、成本计算&#xff1a;3、重连线步骤&#xff1a; 二、图解1、初始化2、路径搜索3、效果展示 3D路径规划是在三维空间中寻找从起点到终点的最短或最优路径的一种技术。它广泛应用于无人机导航、机器人运动规划、虚拟现实…

Docker部署Elasticsearch8.6.0 Kibana8.6.0

&#xff08;1&#xff09;Docker部署Elasticsearch8.5.3&#xff08;失败…&#xff09; 为了匹配springboot3.0.x&#xff0c;安装Elasticsearch:8.5.3 拉取镜像&#xff0c;遇到问题&#xff01; [rootserver01 ~]# docker pull elasticsearch:8.5.3 8.5.3: Pulling from…

Modbus转EtherCAT网关将Modbus协议的数据格式转换为EtherCAT协议

随着工业自动化技术的快速发展&#xff0c;不同通信协议之间的互操作性变得越来越重要。Modbus作为一种广泛使用的串行通信协议&#xff0c;与以太网为基础的EtherCAT协议之间的转换需求日益增长。本文将从网关功能、硬件设计、性能以及应用案例来介绍这款Modbus转EtherCAT网关…

第31篇 计算数据中最长的连续1的个数<一>

Q&#xff1a;如何用Nios II指令计算一个数据中最长的连续1的个数&#xff1f; A&#xff1a;基本原理&#xff1a;所有Nios II指令都是32位长&#xff0c;除了由处理器直接执行的机器指令外&#xff0c;Nios II指令集还包括许多可用于汇编语言的伪指令程序。本实验我们会用…

权限(linux)

权限就是文件权限&#xff08;linux万物皆文件&#xff09; 本文主要涉及文件/文件夹权限 涉及指令&#xff1a; shell&#xff1a; kernal &#xff1a; linux内核 shell &#xff1a; 外壳 shell可以方便交互与操作 bash是一个具体的shell su su 切换用户 su -root 变…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-1

目录 HR企业入驻 HR企业入驻 - 认证流程解析 HR企业入驻 - 查询企业是否存在 HR企业入驻 - 上传企业logo与营业执照 HR企业入驻 - 新企业&#xff08;数据字典与行业tree结构解析&#xff09; 行业tree 行业tree - 创建节点 行业tree - 查询一级分类 行业tree - 查询子分…

普中51单片机:DS1302时钟芯片讲解与应用(十)

文章目录 引言基本特性什么是RAM&#xff1f;什么是涓流充电&#xff1f; 电路图和引脚说明通信协议以及工作流程寄存器控制寄存器日历/时钟寄存器 DS1302读写时序代码演示——数码管显示时分秒 引言 DS1302 是一款广泛使用的实时时钟 (RTC) 芯片&#xff0c;具有低功耗、内置…

多层感知机(神经网络)

目录 一、感知机&#xff08;逻辑回归、二分类&#xff09;定义&#xff1a;二、感知机不能解决XOR问题&#xff1a;三、多层感知机定义&#xff1a;四、训练过程&#xff1a;1.参数维度&#xff1a;2.常用激活函数&#xff1a;2.1Sigmoid激活函数&#xff1a;2.2Tanh激活函数&…