lesson21:Python面向对象编程

目录

引言

一、了解面向对象编程(OOP):编程范式的革命

1.1 什么是面向对象编程?

1.2 OOP vs 面向过程:思维方式的差异

1.3 OOP的三大核心特性

二、类与对象:OOP的基石

2.1 类(Class):对象的“蓝图”

2.2 对象(Object):类的“实体”

2.3 实战:设计一个简单的图书管理系统

三、面向对象的进阶实践

3.1 封装的最佳实践:私有属性与访问控制

3.2 类方法与静态方法

四、为什么选择面向对象编程?

五、总结与进阶方向


引言

在编程世界中,面向对象编程(OOP)是一种将现实世界复杂问题抽象为“对象”的思维方式。Python作为一门支持多范式的语言,不仅提供了简洁的OOP语法,更通过类与对象的设计让代码具备更强的复用性、可维护性和扩展性。本文将从核心概念出发,结合实战案例,带你深入理解Python面向对象编程的精髓。


 一、了解面向对象编程(OOP):编程范式的革命

1.1 什么是面向对象编程?

OOP的核心思想是**“以对象为中心”**,将数据(属性)和操作数据的行为(方法)封装为一个整体。每个对象既是信息的载体,也是功能的执行者。这种思想模拟了现实世界中“事物”的存在方式——例如,一辆汽车有颜色、速度等属性,也有加速、刹车等行为。

1.2 OOP vs 面向过程:思维方式的差异

  • 面向过程:关注“步骤”,按流程拆解任务(如“先做A,再做B”),适合简单线性问题(如脚本工具)。
  • 面向对象:关注“实体”,将问题拆解为相互交互的对象(如“用户”“订单”“商品”),适合复杂系统(如电商平台、游戏开发)。

举例

  • 面向过程实现“学生成绩管理”:定义函数录入成绩()计算平均分()打印报表()
  • 面向对象实现:创建Student类(属性:姓名/成绩;方法:录入/计算/打印),通过实例化对象完成操作。

1.3 OOP的三大核心特性

  • 封装:隐藏对象内部细节,仅通过公共接口交互(如用getter/setter方法控制属性访问)。
  • 继承:子类复用父类代码并扩展功能(如Student类继承Person类的name属性)。
  • 多态:不同对象对同一方法的不同实现(如Animal类的speak()方法,猫实现为“喵喵”,狗实现为“汪汪”)。

二、类与对象:OOP的基石

2.1 类(Class):对象的“蓝图”

类是对一类事物的抽象描述,定义了对象的属性(变量) 和方法(函数)。例如,“人类”类可抽象为:

class Person:
# 类属性:所有实例共享的特征
species = "智人" # 类属性def __init__(self, name, age): # 构造方法:初始化实例属性
self.name = name # 实例属性(每个对象独有)
self.age = agedef greet(self): # 实例方法:对象的行为
return f"你好,我是{self.name},今年{self.age}岁。"
  • 类属性:定义在类中、方法外,所有实例共享(如species)。
  • 实例属性:定义在__init__方法中,通过self.属性名绑定,每个对象独立(如name)。
  • 方法:类中定义的函数,需包含self参数(指代实例自身)。

2.2 对象(Object):类的“实体”

对象是类的具体实例,通过类名()创建。例如,基于Person类创建两个对象:

# 实例化对象
alice = Person("Alice", 25)
bob = Person("Bob", 30)# 访问属性
print(alice.name) # 输出:Alice(实例属性)
print(Person.species) # 输出:智人(类属性)# 调用方法
print(bob.greet()) # 输出:你好,我是Bob,今年30岁。
  • 对象的本质:一个存储属性和方法引用的内存单元。
  • 类与对象的关系:类是模板,对象是根据模板创建的具体产品(如“汽车图纸”与“具体汽车”)。

2.3 实战:设计一个简单的图书管理系统

为了深化理解,我们通过一个案例将类与对象结合:

class Book:
def __init__(self, title, author, isbn):
self.title = title
self.author = author
self.isbn = isbn
self.is_borrowed = False # 默认未借出def borrow(self):
if not self.is_borrowed:
self.is_borrowed = True
return f"《{self.title}》借阅成功!"
return f"《{self.title}》已被借出。"def return_book(self):
if self.is_borrowed:
self.is_borrowed = False
return f"《{self.title}》归还成功!"
return f"《{self.title}》未被借出。"# 使用示例
book1 = Book("Python编程:从入门到实践", "埃里克·马瑟斯", "9787115428028")
print(book1.borrow()) # 输出:《Python编程:从入门到实践》借阅成功!
print(book1.borrow()) # 输出:《Python编程:从入门到实践》已被借出。

三、面向对象的进阶实践

3.1 封装的最佳实践:私有属性与访问控制

Python通过命名约定实现封装:

  • _开头的属性/方法:约定为“私有”,不建议外部直接访问(如_secret)。
  • __开头的属性/方法:触发名称修饰(Name Mangling),外部无法直接访问(如__password)。

示例

class User:
def __init__(self, username, password):
self.username = username
self.__password = password # 私有属性def get_password(self):
return "******" # 隐藏真实密码def set_password(self, new_password):
if len(new_password) >= 8:
self.__password = new_password
return "密码更新成功"
return "密码长度需≥8位"user = User("alice", "12345678")
print(user.get_password()) # 输出:******
print(user.set_password("short")) # 输出:密码长度需≥8位

3.2 类方法与静态方法

除了实例方法,类还支持两种特殊方法:

  • 类方法:用@classmethod装饰,参数为cls(指代类本身),用于操作类属性。
  • 静态方法:用@staticmethod装饰,无默认参数,类似独立函数,与类/实例无关。

示例

class MathUtils:
pi = 3.14159 # 类属性@classmethod
def update_pi(cls, new_value):
cls.pi = new_value # 修改类属性@staticmethod
def add(a, b):
return a + b # 独立功能# 使用类方法
MathUtils.update_pi(3.14)
print(MathUtils.pi) # 输出:3.14# 使用静态方法
print(MathUtils.add(2, 3)) # 输出:5

四、为什么选择面向对象编程?

  1. 代码复用:通过继承减少重复代码。
  2. 模块化:每个类负责单一功能,便于调试和维护。
  3. 可扩展性:新增功能只需添加新类,不影响原有代码(开闭原则)。
  4. 模拟现实:更符合人类对复杂系统的认知方式(如用Car类模拟汽车,Order类模拟订单)。

五、总结与进阶方向

本文从概念到实战,带你掌握了Python面向对象的核心——类与对象的设计。要真正内化OOP思维,建议:

  1. 多写实战代码:尝试用类封装一个小游戏(如贪吃蛇)或工具(如日志管理器)。
  2. 学习设计模式:如单例模式(确保类只有一个实例)、工厂模式(统一创建对象)等。
  3. 深入高级特性:探索属性装饰器(@property)、元类(metaclass)等黑魔法。

面向对象编程不仅是一种语法,更是一种解决问题的哲学。当你能用“对象”的视角拆解复杂问题时,便真正迈入了Python编程的进阶之门。

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

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

相关文章

基于卷积神经网络与小波变换的医学图像超分辨率算法复现

基于卷积神经网络与小波变换的医学图像超分辨率算法复现 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,觉得好请收藏。点击跳转到网站。 1. 引言 医学图像超分辨率技术在临床诊断和治疗规划…

HCIP第一二章笔记整理

第一章:复习HCIA第一阶段应用层:自然语言转换为编码表示层:编码转换为二进制介质访问控制层:二进制转化为信号物理层:传输电信号第二阶段:OSI参考模型应用层:提供网络服务表示层:对数…

《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——2. C++基础:构建程序的坚实骨架

目录一、概述1.1 背景介绍:从UI到逻辑1.2 学习模式:Qt控制台应用二、C语法快速入门2.1 变量、数据类型与注释2.2 函数与代码封装2.3 循环与容器:批量处理三、面向对象编程:封装数据与行为四、Qt的核心扩展:信号与槽通信…

Navicat 远程连接SQLlite数据库

1、SQLlite数据库是一个本地.db文件,默认不支持远程连接; 2、Navicat 可以通过ntunnel_sqlite.php文件连接远程SQLlite库; 3、安装Navicat,安装完成,在安装目录下找到ntunnel_sqlite.php文件; 4、上传当前文…

OpenCV用于计算光流的一个类cv::optflow::DualTVL1OpticalFlow

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::optflow::DualTVL1OpticalFlow 是 OpenCV 中用于计算光流的一个类,特别地,它实现了基于双帧 TV-L1(Total V…

PyQt5在Pycharm上的环境搭建 -- Qt Designer + Pyuic + Pyrcc组合,大幅提升GUI开发效率

软件安装 目标软件: Python解释器Pycharm编辑器 Python官网: 点击访问Python官网 Pycharm官网:点击访问Pycharm官网 环境搭建 搭建完成后最终的环境详情: python安装路径:D:\ProgramEnviron\Python\Python311Pyth…

30天打牢数模基础-卷积神经网络讲解

案例代码实现一、代码说明本案例使用PyTorch实现一个改进版LeNet-5模型,用于CIFAR-10数据集的图像分类任务。代码包含以下核心步骤:数据加载与预处理(含数据增强,划分训练/验证/测试集);定义CNN网络结构&am…

Dev-C++——winAPI贪吃蛇小游戏

🚀欢迎互三👉:雾狩 💎💎 🚀关注博主,后期持续更新系列文章 🚀如果有错误感谢请大家批评指出,及时修改 🚀感谢大家点赞👍收藏⭐评论✍ 今天水一篇吧…

【openbmc6】entity-manager

文章目录 2.1 事件监听:dbus在linux上使用的底层通信方式多半是unix domain socket ,事件的到来可被抽象为:socket上有数据,可读 2.2 事件处理:由于主线程肯定有逻辑得跑,因此新开一个线程甚至多个线程专门用来监听和处理事件,但存在多线程就意味着可能存在竞争,存在竞…

Java 实现 UDP 多发多收通信

在网络通信领域,UDP(用户数据报协议)以其无连接、高效率的特点,在实时通信场景中占据重要地位。本文将结合一段实现 UDP 多发多收的 Java 代码,详细解析其实现逻辑,帮助开发者深入理解 UDP 通信的底层逻辑与…

Java学习第六十二部分——Git

目录 一、关键概述 二、核心概念 三、常用命令 四、优势因素 五、应用方案 六、使用建议 一、关键概述 提问:Git 是什么? 回答:一句话,分布式版本控制系统(DVCS),用来跟踪文件&#…

CDN和DNS 在分布式系统中的作用

一、DNS:域名系统(Domain Name System) 1. 核心功能 DNS是互联网的“地址簿”,负责将人类易记的域名(如www.baidu.com)解析为计算机可识别的IP地址(如180.101.50.242)。没有DNS&…

uniapp用webview导入本地网页,ios端打开页面空白问题

目前还没解决,DCloud官方也说不行 IOS下webview加载本地网页时,无法加载资源 - DCloud问答

软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(8)

接前一篇文章:软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(7) 所属章节: 第15章. 面向服务架构设计理论与实践 第3节 SOA的参考架构 15.3 SOA的参考架构 IBM的Websphere业务集成参考架构(如图15-2所示,以下简称参考架构)是典型的以服务为中心的企业集…

基于 Docker 及 Kubernetes 部署 vLLM:开启机器学习模型服务的新篇章

在当今数字化浪潮中,机器学习模型的高效部署与管理成为众多开发者和企业关注的焦点。vLLM 作为一款性能卓越的大型语言模型推理引擎,其在 Docker 及 Kubernetes 上的部署方式如何呢?本文将深入探讨如何在 Docker 及 Kubernetes 集群中部署 vL…

工业互联网六大安全挑战的密码“解法”

目录 工业互联网密码技术应用Q&A Q1:设备身份认证与接入控制 Q2:通信数据加密与完整性保护 Q3:远程安全访问 Q4:平台与数据安全 Q5:软件与固件安全 Q6:日志审计与抗抵赖 首传信安-解决方案 总…

基于springboot的在线问卷调查系统的设计与实现(源码+论文)

一、开发环境 1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生,不仅仅是创造者感觉C语言在编程上面很麻烦,如果只是专注于业务逻辑的处理,会导致忽略了各种指针以及垃圾回收这些操作&#x…

民法学学习笔记(个人向) Part.1

民法学学习笔记(个人向) Part.1有关民法条文背后的事理、人心、经济社会基础;民法的结构民法学习的特色就是先学最难的民法总论,再学较难的物权法、合同法等,最后再学习最简单的婚姻、继承、侵权部分。这是一个由难到易的过程,尤为…

ElasticSearch Doc Values和Fielddata详解

一、Doc Values介绍倒排索引在搜索包含指定 term 的文档时效率极高,但在执行相反操作,比如查询一个文档中包含哪些 term,以及进行排序、聚合等与指定字段相关的操作时,表现就很差了,这时候就需要用到 Doc Values。倒排…

【C语言】解决VScode中文乱码问题

文章目录【C语言】解决VScode中文乱码问题弹出无法写入用户设置的处理方法弹出无法在只读编辑器编辑的问题处理方法【C语言】解决VScode中文乱码问题 💬欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共…