news 2026/9/22 0:51:46

【Python】基础语法入门(十六)——面向对象编程(OOP)核心精讲

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python】基础语法入门(十六)——面向对象编程(OOP)核心精讲


🧱说明:虽然面向对象(OOP)在早期章节已有初步介绍,但因其重要性,本篇作为系统性回顾与深化,聚焦 OOP 四大支柱(封装、抽象、继承、多态)及 Python 特色实现。你将学会如何用类(Class)优雅地建模现实世界,写出可维护、可扩展的代码。

无论你是初学 OOP,还是想夯实基础,本文都将助你:

  • 理解self的本质
  • 掌握属性与方法的设计
  • 合理使用继承与多态
  • 避开常见陷阱

1. 为什么需要面向对象?

过程式编程的局限

# 模拟两个学生name1="小明"age1=18grade1="高一"name2="小红"age2=17grade2="高二"defprint_student(name,age,grade):print(f"{name},{age}岁,{grade}")

❌ 问题:数据与行为分离,难以扩展,易出错(如传参顺序错乱)。

面向对象的解决方案

classStudent:def__init__(self,name,age,grade):self.name=name self.age=age self.grade=gradedefintroduce(self):print(f"{self.name},{self.age}岁,{self.grade}")s1=Student("小明",18,"高一")s2=Student("小红",17,"高二")s1.introduce()

✅ 优势:数据 + 行为 封装在一起,逻辑清晰,易于复用。


2. 类与对象:核心概念

概念说明
类(Class)蓝图或模板(如“学生”这个概念)
对象(Object/Instance)类的具体实例(如“小明”这个学生)
属性(Attribute)对象的数据(name,age
方法(Method)对象的行为(introduce()

__init__self

  • __init__:构造方法,创建对象时自动调用
  • self:代表当前实例,必须作为第一个参数

🔍self的本质
当你调用s1.introduce(),Python 实际执行的是Student.introduce(s1)
self就是那个隐式传入的s1


3. 封装(Encapsulation):隐藏内部细节

通过私有属性/方法限制外部直接访问,提供公共接口。

Python 的“私有”约定

  • 单下划线_x受保护(约定不直接访问)
  • 双下划线__x名称改写(真正隐藏)
classBankAccount:def__init__(self,owner,balance=0):self.owner=owner self.__balance=balance# 私有属性defdeposit(self,amount):ifamount>0:self.__balance+=amountelse:raiseValueError("存款金额必须为正")defget_balance(self):returnself.__balance# 通过方法安全访问acc=BankAccount("Alice")acc.deposit(100)print(acc.get_balance())# 100# print(acc.__balance) # ❌ AttributeError!print(acc._BankAccount__balance)# ⚠️ 技术上可行,但绝不推荐!

最佳实践:用property提供更优雅的访问(见下文)。


4. 继承(Inheritance):代码复用

子类继承父类的属性和方法,并可扩展或重写。

示例:学生与研究生

classStudent:def__init__(self,name,student_id):self.name=name self.student_id=student_iddefstudy(self):print(f"{self.name}正在学习")classGraduateStudent(Student):# 继承 Studentdef__init__(self,name,student_id,advisor):super().__init__(name,student_id)# 调用父类构造self.advisor=advisordefresearch(self):print(f"{self.name}{self.advisor}指导下做研究")grad=GraduateStudent("李华","G123","张教授")grad.study()# 继承自 Studentgrad.research()# 自有方法

🔑super():安全调用父类方法,支持多重继承。


5. 多态(Polymorphism):同一接口,不同实现

不同类的对象对同一方法做出不同响应。

示例:动物叫声

classAnimal:defspeak(self):raiseNotImplementedError("子类必须实现 speak 方法")classDog(Animal):defspeak(self):return"汪汪!"classCat(Animal):defspeak(self):return"喵喵~"defmake_animal_speak(animal):print(animal.speak())# 同一接口,不同行为make_animal_speak(Dog())# 汪汪!make_animal_speak(Cat())# 喵喵~

优势make_animal_speak不关心具体类型,只要实现了speak即可。


6. 特殊方法(Magic Methods / Dunder Methods)

以双下划线包围的方法,用于定义类的内置行为

方法作用示例
__str__print(obj)时的字符串表示return f"学生: {self.name}"
__repr__开发者调试用的“官方”字符串return f"Student('{self.name}')"
__len__支持len(obj)return len(self.items)
__eq__支持==比较return self.id == other.id
__add__支持+运算return Vector(self.x+other.x, ...)

示例:让自定义类支持len()print()

classBookshelf:def__init__(self,books):self.books=booksdef__len__(self):returnlen(self.books)def__str__(self):returnf"书架上有{len(self)}本书"def__repr__(self):returnf"Bookshelf({self.books!r})"shelf=Bookshelf(["Python入门","算法导论"])print(len(shelf))# 2print(shelf)# 书架上有 2 本书

💡黄金法则

  • __str__面向用户,要友好
  • __repr__面向开发者,要明确(理想情况下eval(repr(obj)) == obj

7.@property:将方法变为属性

让 getter/setter 更自然,同时保持封装。

classCircle:def__init__(self,radius):self._radius=radius@propertydefradius(self):returnself._radius@radius.setterdefradius(self,value):ifvalue<0:raiseValueError("半径不能为负")self._radius=value@propertydefarea(self):return3.14159*self._radius**2c=Circle(5)print(c.radius)# 5(像访问属性)print(c.area)# 78.53975(只读属性)c.radius=10# 触发 setter,自动校验

优势:外部无需知道radius是计算属性还是存储属性。


8. 常见误区与最佳实践

误区正确做法
滥用继承(“继承一切”)优先组合(Composition),而非继承
忽略__init__中的super()多重继承时必须调用
所有属性都公开property或私有属性控制访问
不写文档字符串为类和方法添加"""说明"""
过度设计先写简单类,再根据需求重构

组合优于继承示例

# ❌ 不好的继承classBird:deffly(self):passclassPenguin(Bird):# 企鹅不会飞!deffly(self):raiseNotImplementedError# ✅ 更好的组合classFlyer:deffly(self):print("Flying!")classBird:def__init__(self,can_fly=True):self.flyer=Flyer()ifcan_flyelseNonedeffly(self):ifself.flyer:self.flyer.fly()else:print("我不会飞 😢")

9. 总结:OOP 设计原则

  1. 单一职责:一个类只负责一件事
  2. 开闭原则:对扩展开放,对修改关闭
  3. 里氏替换:子类对象能替换父类对象
  4. 依赖倒置:依赖抽象,而非具体实现

🐍记住:OOP 是工具,不是目的。
“当你的问题适合用对象建模时,才使用 OOP。”


下一步练习

  1. 为你的 To-Do List 项目设计类结构:
    • Task类(含标题、状态、创建时间)
    • TaskManager类(管理任务列表,支持增删查改)
  2. Task添加__str____repr__
  3. @property实现is_completed只读属性

当你能用类清晰表达业务逻辑时,你就真正掌握了 Python 的力量。

继续构建你的对象世界吧!

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

智谱开源天团登陆 AtomGit,4 大模型覆盖多模态全场景!

智谱 AI 4 款多模态核心模型在 AtomGit 平台集中开源&#xff01;基于 Open-AutoGLM 、GLM-4.6V、GLM-ASR-Nano-2512、GLM-TTS 组成的模型矩阵&#xff0c;构建起 “手机操作 视觉理解 语音识别 文本转语音”的全链路多模态 AI 生态。这次开源不仅打破 “AI 只停留在聊天框”…

作者头像 李华
网站建设 2026/9/21 17:48:29

开源视频生成技术再突破:Wan2.1-FLF2V-14B模型实现720P高清流畅过渡

在人工智能生成内容&#xff08;AIGC&#xff09;领域&#xff0c;视频生成技术正经历着前所未有的快速发展。其中&#xff0c;首尾帧驱动的视频生成技术因其高效性和易用性&#xff0c;逐渐成为内容创作领域的新宠。近日&#xff0c;Wan团队正式发布了旗下最新力作——Wan2.1-…

作者头像 李华
网站建设 2026/9/21 13:45:51

教学辅助微信小程序设计毕业设计(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌ 专注于VUE,小程序&#xff0c;安卓&#xff0c;Java,python,物联网专业&#xff0c;有18年开发经验&#xff0c;长年从事毕业指导&#xff0c;项目实战✌选取一个适合的毕业设计题目很重要。✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、…

作者头像 李华
网站建设 2026/9/21 1:34:18

【AUTOSAR AP Core】AUTOSAR AP核心:Executor角色揭秘

目录标题 1. Executor 在 AUTOSAR AP 中到底扮演什么角色? 1.1 从 “线程” 到 “执行上下文”:Core 的抽象视角 1.2 与 OS / Execution Management 的边界:谁管什么? 1.3 与 Future / Result / ErrorCode 的协同关系 2. 规范里的 Executor:需求与设计细节拆解 2.1 API 形…

作者头像 李华
网站建设 2026/9/21 22:47:30

Chrony时间同步服务:从底层原理到技术演进的全景解析

一、底层原理&#xff1a;时钟驯服算法的革命性突破 Chrony的核心突破在于其时钟驯服算法&#xff08;Clock Discipline Algorithm&#xff09;&#xff0c;该算法通过动态调整系统时钟频率实现亚秒级精度同步。其工作机制可分为三个关键层次&#xff1a; 1. 时钟偏差测量体系 …

作者头像 李华
网站建设 2026/9/21 23:39:17

线性回归与KNN算法的核心原理及实践应用

文章目录线性回归与KNN算法的核心原理及实践应用一、机器学习基础概念二、线性回归分析2.1 相关关系与回归分析2.2 一元线性回归模型2.3 误差项分析2.4 参数估计方法2.5 模型评价指标三、K-近邻算法&#xff08;KNN&#xff09;3.1 算法原理3.2 距离度量3.3 算法优缺点四、实践…

作者头像 李华