news 2026/3/12 5:32:06

【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/3/12 1:12:47

Downkyi:B站视频下载的智能管家

还在为B站视频无法离线收藏而苦恼吗&#xff1f;Downkyi作为一款专业的哔哩哔哩视频下载工具&#xff0c;彻底解决了视频保存的难题。无论是单个精彩片段还是系列课程&#xff0c;这款软件都能轻松搞定&#xff0c;让你随时随地享受优质内容。 【免费下载链接】downkyi 哔哩下载…

作者头像 李华
网站建设 2026/3/5 2:36:22

AIGC在测试领域的全面应用:从需求生成到自动化脚本

随着人工智能生成内容&#xff08;AIGC&#xff09;技术的迅猛发展&#xff0c;软件测试领域正迎来一场深刻的变革。传统的测试方法依赖人工设计用例、执行脚本和缺陷分析&#xff0c;而AIGC通过自然语言处理、大语言模型和生成式算法&#xff0c;实现了测试流程的智能化升级。…

作者头像 李华
网站建设 2026/3/10 18:57:35

CompletableFuture的5个大坑!

往期热门文章&#xff1a;1、Spring 项目别再乱注入 Service 了&#xff01;用 Lambda 封装个统一调用组件&#xff0c;爽到飞起 2、再见Maven&#xff01;官方推出全新一代Java项目构建工具&#xff0c;性能提升2~10倍 3、程序员的伪年薪百万还能持续多久&#xff1f; 4、索引…

作者头像 李华
网站建设 2026/3/7 8:00:59

土耳其AI里程碑:Kumru本土语言模型如何重塑数字生态格局

在全球人工智能竞赛中&#xff0c;语言模型的本土化发展正成为国家数字战略的核心竞争力。土耳其近期推出的Kumru模型&#xff0c;不仅填补了该国在主流语言模型领域的空白&#xff0c;更标志着其在构建自主可控的AI生态系统上迈出了决定性步伐。这款由土耳其工程师团队独立研发…

作者头像 李华
网站建设 2026/3/11 16:40:33

NCMconverter音频格式转换工具:解锁ncm文件的全新使用体验

NCMconverter音频格式转换工具&#xff1a;解锁ncm文件的全新使用体验 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter NCMconverter是一款专为解决ncm格式音频文件兼容性问题而设…

作者头像 李华