news 2026/9/11 5:41:31

python学习笔记 -- 面向对象之类和对象

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python学习笔记 -- 面向对象之类和对象

第8章 面向对象之类和对象

8.1面向对象和面向过程

8.1.1 程序设计的思路

面向对象,是软件开发中的一类编程风格、开发范式。除了面向对象,还有面向过程。在所有的编程范式中,我们接触最多的还是面向过程和面向对象两种。

类比:史书类型

  • 纪传体:以人物传记为中心,“本纪”叙述帝王,“世家”记叙王侯封国和特殊人物,“列传”记叙民间人物。
  • 编年体:按年、月、日顺序编写。
  • 国别体:是一部分国记事的历史散文,分载多国历史。

早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显,出现了面向对象思想并成为目前主流的方式。

1. 面向过程的程序设计思想(Process-Oriented Programming),简称POP

  • 关注的焦点是过程:过程就是操作数据的步骤。如果某个过程的实现代码重复出现,那么就可以把这个过程抽取为一个函数。这样就可以大大简化冗余代码,便于维护。
  • 典型的语言:C语言
  • 代码结构:以函数为组织单位。
  • 是一种“执行者思维”,适合解决简单问题。扩展能力差、后期维护难度较大。

2. 面向对象的程序设计思想( Object Oriented Programming),简称OOP

  • 关注的焦点是:在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,用类来表示。
  • 典型的语言:Java、C#、C++、Python、Ruby和PHP等
  • 代码结构:以为组织单位。每种事物都具备自己的属性行为/功能
  • 是一种“设计者思维”,适合解决复杂问题。代码扩展性强、可维护性高。

8.1.2 由实际问题考虑如何设计程序

思考1:如何开车?

面向过程思想思考问题时,我们首先思考“怎么按步骤实现?”并将步骤对应成方法,一步一步,最终完成。 这个适合简单任务,不需要过多协作的情况。针对如何开车,可以列出步骤:


面向过程适合简单、不需要协作的事务,重点关注如何执行。

思考2:如何造车?

造车太复杂,需要很多协作才能完成。此时我们思考的是“车怎么设计?”,而不是“怎么按特定步骤造车的问题”。这就是思维方式的转变,前者就是面向对象思想。所以,面向对象(Oriented-Object)思想更契合人的思维模式。

用面向对象思想思考“如何设计车”:

自然地,我们就会从“车由什么组成”开始思考。发现,车由如下结构组成:

我们找轮胎厂完成制造轮胎的步骤,发动机厂完成制造发动机的步骤,…;这样,大家可以同时进行车的制造,最终进行组装,大大提高了效率。但是,具体到轮胎厂的一个流水线操作,仍然是有步骤的,还是离不开面向过程思维!

因此,面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。

注意:

我们千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!

8.1.3 面向过程示例

想象一下,你要做一顿美味的晚餐。在面向过程编程的思维下,你会把整个做饭的过程拆分成一系列的步骤。

defbuy():print("去超市购买食材。")defwash():print("清洗蔬菜。")defcut():print("切菜。")defcook():print("开始烹饪。")defserve():print("上菜啦!")buy()wash()cut()cook()serve()

上面就是一个典型的面向过程的程序,我们把整个做饭的过程分解成了一个个函数,每个函数完成一个特定的任务,然后按照顺序依次调用这些函数,就可以完成做晚餐的任务啦。这种方式非常直接,适合一些简单的任务,它注重的是程序的流程和步骤。

但是呢,当我们的程序变得越来越复杂,会出现什么问题呢?比如说,我们现在想做不同类型的菜,有些菜可能不需要洗菜,有些菜可能不需要切菜,或者你要同时做几道菜,那我们的代码就会变得越来越长,越来越乱,而且上面的代码步骤是没有通用性的。

8.1.4 面向对象示例

用面向对象的思想实现上面的做菜功能。

""" 面向对象编程 """classDish:def__init__(self,name):self.name=namedefprepare(self):passclassSalad(Dish):defprepare(self):print(f"为{self.name}购买食材。")print(f"清洗{self.name}的蔬菜。")print(f"切{self.name}的蔬菜。")print(f"将{self.name}装盘。")classSoup(Dish):defprepare(self):print(f"为{self.name}购买食材。")print(f"煮{self.name}。")salad=Salad("蔬菜沙拉")soup=Soup("紫菜鸡蛋汤")salad.prepare()print()soup.prepare()print()

在这里,我们创建了一个 Dish 类,它就像是一个菜的模板。然后我们创建了 Salad、Soup 这些子类,它们都继承自 Dish 类。每个子类都有自己的 prepare 方法,这个方法描述了如何准备这道菜。

这样,我们可以看到面向对象编程的优势啦 首先,我们把相关的数据(比如菜的名字)和操作(比如准备菜的过程)都封装在了一个类里面,这叫做 “封装”。而且,不同类型的菜可以有自己独特的准备方法,我们可以根据需要去修改或扩展这些方法,而不会影响其他类。这就像是每个菜都有自己的制作过程。

还有,当我们想要添加新的菜品时,我们只需要创建一个新的子类,定义它自己的 prepare 方法就好,不需要修改原来的代码。

8.1.5 面向对象编程思想的历史

对象作为编程实体最早是于1960年代由Simula 67语言引入思维。Simula这一语言是奥利-约翰·达尔和克利斯登·奈加特在奥斯陆的挪威计算中心为模拟环境而设计的。(据说,他们是为了模拟船只而设计的这种语言,并且对不同船只间属性的相互影响感兴趣。他们将不同的类型船只归纳为不同的类,而每一个对象,基于它的类,可以定义它自己的属性和行为。)

这种办法是分析式程序的最早概念体现。在分析式程序中,我们将真实世界的对象映射到抽象的对象,这叫做“模拟”。Simula不仅引入了“类”的概念,还应用了实例这一思想,这可能是这些概念的最早应用。

8.2 类和对象

人认识世界,其实就是面向对象的。比如,我们认识一下美人鱼(都没见过)

经过“仔细学习”,发现美人鱼通常具备一些特征:

  • 女孩
  • 有鱼尾
  • 美丽

这个总结的过程,其实是抽象化的过程。
抽象出来的美人鱼的特征,可以归纳为一个美人鱼类
而图片中的都是这个类呈现出来的具体的对象

8.2.1 类和对象概述

类(Class)对象(Object)是面向对象的核心概念。

1、什么是类

:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。

2、什么是对象

对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)

可以理解为:类 => 抽象概念的人对象 => 实实在在的某个人

类描述了所创建的对象共同的属性(是什么)和方法(能做什么),属性和方法统称为类的成员。

  • 类是对大量对象共性的抽象
  • 类是创建对象的模板
  • 类是客观事物在人脑中的主观反映

对象是类的具体实例,拥有类定义的属性和方法。

  • 在自然界中,只要是客观存在的事物都是对象
  • 类是抽象的,对象是类的实例(Instance),是具体的。
  • 一个对象有自己的状态(属性)、行为(方法)和唯一的标识(本质上指内存中所创建的对象的地址)。

8.2.2 定义类

定义类的语法格式:

class类名:"""类说明文档"""类体
  • 类名一般使用大驼峰命名法。
  • 类体中可以包含类属性(也叫类变量)、方法、实例属性(也叫实例变量)等。

示例:定义一个人的类,包含__init__()方法、eat()方法和drink()方法。

classPerson:"""人的类"""home="earth"def__init__(self):self.age=0defeat(self):print("eating...")defdrink(self):print("drinking...")

8.2.3 类的操作之一:成员引用

语法格式:

类名.成员名

示例

# 获取类的成员print("类的文档说明:",Person.__doc__)print("类变量home:",Person.home)# print("实例变量age:",Person.age) # 报错,注意age前面有self,所以是实例变量,不是类变量,不能通过类名获取print("类的成员:",Person.__init__)print("类的方法:",Person.eat)# 注意eat后面没有(),否则就是调用eat方法了print("类的方法:",Person.drink)# 注意drink后面没有(),否则就是调用drink方法了
类的文档说明: 人的类 类变量home: earth 类的成员: <function Person.__init__ at 0x0000017C8CABB7E0> 类的方法: <function Person.eat at 0x0000017C8CB35B20> 类的方法: <function Person.drink at 0x0000017C8CB35DA0>

8.2.4 类的操作之二:实例化

创建类的对象的过程称为实例化。

创建对象的语法格式:

变量名=类名()变量名=类名(实参列表)

示例代码:

# 创建对象p=Person()# 创建一个对象print
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 5:37:41

Git常用命令介绍

Git常用命令介绍 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目 一、Git的安装 安装包下载地址&#xff1a;Git for Windows 国内的镜像地址&#xff1a;https://npm.taobao.org/mirrors/git-for-windows/ 完成安装之后&#xff0…

作者头像 李华
网站建设 2026/9/11 5:41:29

具身智能草根指南:低成本机器人开发实战与避坑

不管你看的是波士顿动力那种动辄几十万美元的 Atlas 后空翻视频&#xff0c;还是宇树科技把四足机器人价格打到万元级以内&#xff0c;都会产生一种感觉&#xff1a;机器人世界正在变得越来越热闹。热闹的背后&#xff0c;一个容易被忽略的事实是——机器人世界已经出现了明显的…

作者头像 李华
网站建设 2026/8/30 10:55:00

可穿戴NFC安全模块设计:从协议选型到天线调优的完整实践

1. 项目概述与需求拆解 把一块紧凑的NFC安全模块塞进智能穿戴设备里&#xff0c;对很多人的第一反应可能是“焊一个NFC芯片&#xff0c;绕一圈天线&#xff0c;完事”。但如果你真的做过支付手环、智能戒指或者带NFC门禁的手表&#xff0c;就会发现这个“完事”后面藏着一长串问…

作者头像 李华
网站建设 2026/9/1 22:03:38

深度优先搜索与动态规划实战:邮票面值设计算法解析

1. 项目概述&#xff1a;从一道竞赛题看算法思维的实战价值 “邮票面值设计”这道题&#xff0c;乍一看像是数学问题&#xff0c;但本质上是一道经典的 组合优化与搜索算法 题。它源自2022年全国青少年信息素养大赛Python国赛&#xff0c;对于很多从语法入门转向算法实战的Py…

作者头像 李华
网站建设 2026/8/31 2:30:19

Minecraft整合包制作:路径追踪光影优化与漏光修复实战

各位朋友大家好&#xff0c;我入坑光影整合包也有几年时间了&#xff0c;从最早的 OptiFine 到现在的 Iris 路径追踪光影&#xff0c;中间踩过不少坑&#xff0c;尤其是“模型底部漏光”和“莫名其妙黑影 BUG”这两个问题&#xff0c;一度让我以为是显卡坏了。后来自己做整合包…

作者头像 李华