尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

【Python】基础语法入门(十六)——面向对象编程(OOP)核心精讲
📅 发布时间:2026/6/19 3:04:42


🧱说明:虽然面向对象(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 的力量。

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

相关新闻

  • Wan2.2-T2V-A14B在心理治疗可视化干预中的新兴用途
  • 揭秘量子机器学习调试黑盒:如何在VSCode中高效定位量子算法错误
  • GraniStudio零代码平台调试算子方式有多少种?分别都是如何调试?

最新新闻

  • 黄金暴涨:虚拟时代的原始信仰
  • 如何用免费在线工具深度分析无人机飞行日志:UAV Log Viewer完全指南
  • 炉石传说终极插件指南:如何用HsMod快速提升游戏体验
  • Digital-IDE:3步在VSCode中搭建专业硬件开发环境
  • 凯乐石携手小沓AI:加速品牌数字化转型,迈向AI驱动新未来
  • 如何免费解锁Cursor Pro功能:3步实现AI编程助手无限使用终极指南

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号