news 2026/4/16 10:45:14

【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/4/16 7:51:03

卡尔曼滤波在温度测量中的应用及Simulink实例解析

卡尔曼滤波simulink实例,卡尔曼滤波在温度测量中的应用今天咱们来聊一个在工程领域特别实用的技术——卡尔曼滤波。这玩意儿名字听着挺唬人&#xff0c;但说白了就是个"带脑子的数据过滤器"。就拿温度测量来说&#xff0c;传感器数据总带着点噪声对吧&#xff1f;这时…

作者头像 李华
网站建设 2026/4/16 0:18:46

OpenHarmony Flutter 分布式数据管理:跨设备数据同步与一致性保障方案

前言在开源鸿蒙&#xff08;OpenHarmony&#xff09;全场景分布式生态中&#xff0c;跨设备数据管理是实现多设备协同体验一致性的核心支撑。传统单设备数据存储方案存在数据孤岛问题&#xff0c;多设备间的数据同步依赖云端转发、延迟高且易丢失&#xff1b;而基于开源鸿蒙的分…

作者头像 李华
网站建设 2026/4/16 10:42:39

DownKyi终极指南:快速构建个人B站资源管理中心

DownKyi终极指南&#xff1a;快速构建个人B站资源管理中心 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;。…

作者头像 李华
网站建设 2026/4/9 21:53:08

新闻资讯微信小程序开发计算机毕设(源码+lw+部署文档+讲解等)

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

作者头像 李华
网站建设 2026/4/16 10:44:32

Wan2.2-T2V-A14B能否生成符合ATSC标准的超高清广播信号内容

Wan2.2-T2V-A14B能否生成符合ATSC标准的超高清广播信号内容 在广播电视系统仍以严谨工程规范运行的今天&#xff0c;AI生成内容正以前所未有的速度冲击传统制作流程。当一部由文本自动生成的火星探险短片出现在本地新闻插播时段&#xff0c;观众不会关心它是否来自大模型——他…

作者头像 李华