Python 面向对象编程完全指南:从入门到精通
📢 大家好!今天我们来深入学习 Python 面向对象编程(OOP)的核心知识。这篇文章涵盖了面向对象的基本概念、类的定义与使用、魔法方法、继承等核心内容,通过丰富的案例帮助大家彻底掌握 OOP。
📚 目录
一、面向对象与面向过程
二、面向对象三大特征
三、类与对象入门
四、self 关键字详解
五、属性操作
六、魔法方法
七、继承
八、综合案例
九、总结
一、面向对象与面向过程
1.1 编程思想
编程思想就是人们利用计算机来解决问题的思维方式。
1.2 面向过程
它是一种编程思想,强调的是以步骤(过程)为基础完成各种操作。
特点:
关注"怎么做"
按照流程一步步执行
适合简单、固定的任务
1.3 面向对象
它是一种编程思想,强调的是以对象为基础完成各种操作,它是基于面向过程的。
思想特点:
✅更符合人们的思考习惯——用"谁做了什么"来思考问题
✅把复杂的事情简单化——将大问题拆解成小对象
✅把人从执行者变成指挥者——你指挥对象去干活
举例说明:
买电脑
面向过程:自己查配置→去电脑城→比价→砍价→买回家
面向对象:找懂电脑的朋友(对象)→朋友帮你搞定一切
洗衣服
面向过程:拿衣服→放水→加洗衣液→搓洗→漂洗→拧干→晾晒
面向对象:把衣服扔进洗衣机(对象)→按按钮→洗衣机帮你洗完
总结:万物皆对象
二、面向对象三大特征
2.1 封装
概述:隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
举例:
电脑:你不需要知道 CPU 怎么工作,只需要用键盘鼠标操作
手机:你不需要知道内部电路,只需要点屏幕
函数:你只需要调用,不需要知道内部实现
好处:
✅ 提高代码的安全性(私有化)
✅ 提高代码的复用性(函数封装)
2.2 继承
概述:子类继承父类的成员(属性、行为等)。大白话:子承父业。
好处:✅ 提高代码的复用性
2.3 多态
概述:
大白话:同一个事物在不同时刻表现出来的不同状态、形态
专业版:同一个函数,接收不同的对象,有不同的效果
三、类与对象入门
3.1 核心概念
| 概念 | 说明 | 示例 |
|---|---|---|
| 类 | 抽象的概念,是属性+行为的集合 | 汽车设计图 |
| 对象 | 类的具体体现、实例 | 根据设计图造出来的汽车 |
| 属性(名词) | 描述事物的外在特征 | 颜色、品牌、价格 |
| 行为(动词) | 描述事物能做什么 | 跑、停、鸣笛 |
3.2 定义类的格式
class 类名: # 属性(变量) # 行为(函数)
3.3 入门案例:汽车类
""" 需求:定义汽车类,有跑的行为 """ # 1. 定义汽车类(类名遵循大驼峰命名法) class Car: # 属性(名词) # 行为(动词) def run(self): print('汽车会跑!') # 2. 创建汽车类的对象 c1 = Car() # 3. 调用 Car 类的 run() 函数 c1.run() # 输出: 汽车会跑!3.4 访问类中成员的格式
# 1. 创建对象 对象名 = 类名() # 2. 通过 对象名. 的方式调用 对象名.属性名 对象名.行为名()
四、self 关键字详解
4.1 什么是 self
概述:
self是 Python 内置的关键字,用于表示本类当前对象的引用大白话:谁调用函数,
self就代表谁
4.2 self 的作用
1 个类可以有多个对象,这多个对象都可以通过对象名.的方式访问类中的行为(函数)。函数通过self来区分到底是哪个对象调用的该函数。
class Car: def run(self): print(f'汽车会跑!self的值是: {self}') c1 = Car() print(f'c1对象: {c1}') c1.run() # self 指向 c1 c2 = Car() print(f'c2对象: {c2}') c2.run() # self 指向 c24.3 类内访问其他函数
总结:
在类外访问类中的行为,通过
对象名.的方式在类内访问类中的行为,通过
self.的方式
class Car: def run(self): print(f'{self} 汽车在跑...') def work(self): print(f'我是work函数,self值: {self}') self.run() # 在类内访问其他函数,用 self. c1 = Car() c1.work() # 输出: 我是work函数... 汽车在跑...五、属性操作
5.1 类外设置和获取属性
class Car: def run(self): print('汽车会跑...') # 创建对象 c1 = Car() # 类外设置属性(独属于 c1 对象) c1.color = '红色' c1.number = 4 # 类外获取属性 print(f'颜色: {c1.color}, 轮胎数: {c1.number}') # 输出: 颜色: 红色, 轮胎数: 45.2 类内获取对象的属性
class Car: def run(self): print('汽车会跑') def show(self): # 在类内通过 self. 访问属性 print(f'颜色: {self.color}, 轮胎数: {self.number}') c1 = Car() c1.color = '红色' c1.number = 4 c1.show() # 输出: 颜色: 红色, 轮胎数: 4⚠️ 注意:类外设置的属性只属于当前对象,其他对象没有该属性。
六、魔法方法
6.1 什么是魔法方法
魔法方法是 Python 内置的函数,在满足特定的场景下会被自动调用。
| 魔法方法 | 触发时机 |
|---|---|
__init__() | 创建对象时自动调用 |
__str__() | print(对象)时自动调用 |
__del__() | 对象被销毁时自动调用 |
6.2__init__()魔法方法(构造方法)
无参版
class Car: def __init__(self): print('我是无参 init 魔法方法') self.color = '黑色' # 默认属性 self.number = 3 def show(self): print(f'颜色: {self.color}, 轮胎数: {self.number}') c1 = Car() # 自动调用 __init__() c1.show() # 输出: 颜色: 黑色, 轮胎数: 3有参版(推荐)
class Car: def __init__(self, color, number): """在创建对象时,给属性赋值""" self.color = color self.number = number def show(self): print(f'颜色: {self.color}, 轮胎数: {self.number}') c1 = Car('红色', 6) # 传入参数 c1.show() # 输出: 颜色: 红色, 轮胎数: 66.3__str__()魔法方法
class Car: def __init__(self, color, number): self.color = color self.number = number def __str__(self): # 重写,打印有意义的属性信息 return f'颜色: {self.color}, 轮胎数: {self.number}' c1 = Car('绿色', 4) print(c1) # 自动调用 __str__(),输出: 颜色: 绿色, 轮胎数: 46.4__del__()魔法方法
class Car: def __init__(self, brand): self.brand = brand def __str__(self): return f'品牌: {self.brand}' def __del__(self): print(f'{self} 对象被删除了!') c1 = Car('小米 Su7 Ultra') print(c1) del c1 # 手动删除,触发 __del__()七、继承
7.1 继承入门
| 概念 | 说明 |
|---|---|
| 继承 | 子类继承父类的属性和行为(子承父业) |
| 子类/派生类 | 继承别的类的类 |
| 父类/基类/超类 | 被继承的类 |
| 好处 | 提高代码的复用性 |
| 弊端 | 耦合性增强,父类不好的内容子类也得有 |
开发原则:高内聚、低耦合
7.2 继承的基本格式
class 父类名: # 父类成员 class 子类名(父类名): pass # 子类自动拥有父类的所有成员
7.3 单继承演示
# 1. 定义师傅类 class Master: def __init__(self): self.kongfu = '[古法配方]' def make_cake(self): print(f'采用 {self.kongfu} 摊煎饼果子') # 2. 定义徒弟类,继承师傅类 class Prentice(Master): pass # 3. 测试 p = Prentice() p.make_cake() # 输出: 采用 [古法配方] 摊煎饼果子7.4 多继承演示
class Master: def __init__(self): self.kongfu = '[古法配方]' def make_cake(self): print(f'运用 {self.kongfu} 制作煎饼果子') class School: def __init__(self): self.kongfu = '[AI配方]' def make_cake(self): print(f'运用 {self.kongfu} 制作煎饼果子') # 多继承:从左往右,就近原则 class Prentice(School, Master): pass xm = Prentice() print(xm.kongfu) # 输出: [AI配方](School 的) xm.make_cake() # 输出: 运用 [AI配方] 制作煎饼果子7.5 MRO 机制
MRO(Method Resolution Order)可以查看某个对象调用函数时的查找顺序:
print(Prentice.mro()) # Prentice -> School -> Master -> object print(Prentice.__mro__) # 同上
八、综合案例
8.1 减肥案例
""" 需求:小明当前体重 100kg,跑步一次减 0.5kg,大吃大喝一次增 2kg """ class Student: def __init__(self): self.current_weight = 100 def run(self): print('疯狂跑步...') self.current_weight -= 0.5 def eat(self): print('大吃大喝一顿...') self.current_weight += 2 def __str__(self): return f'当前体重: {self.current_weight} kg!' xm = Student() xm.run() xm.run() xm.eat() print(xm) # 当前体重: 101.0 kg!8.2 烤地瓜案例
""" 需求: 1. 属性:烘烤时间、烘烤状态、调料列表 2. 行为:烘烤、添加调料 3. 规则: [0, 3) → 生的 [3, 7) → 半生不熟 [7, 12) → 熟了 [12, ∞] → 糊了 """ class SweetPotato: def __init__(self): self.cook_time = 0 self.cook_state = '生的' self.condiments = [] def cook(self, time): self.cook_time += time if 0 <= self.cook_time < 3: self.cook_state = '生的' elif 3 <= self.cook_time < 7: self.cook_state = '半生不熟' elif 7 <= self.cook_time < 12: self.cook_state = '熟了' else: self.cook_state = '糊了' def add_condiment(self, condiment): self.condiments.append(condiment) def __str__(self): return f'烘烤时间: {self.cook_time}, 状态: {self.cook_state}, 调料: {self.condiments}' dg = SweetPotato() dg.cook(3) dg.cook(5) dg.cook(7) dg.add_condiment('芥末') dg.add_condiment('折耳根') print(dg) # 烘烤时间: 15, 状态: 糊了, 调料: ['芥末', '折耳根']九、总结
9.1 核心知识点速记
| 概念 | 要点 |
|---|---|
| 面向对象 | 以对象为基础,更符合人类思维 |
| 三大特征 | 封装、继承、多态 |
| 类与对象 | 类是图纸,对象是实物 |
| self | 代表当前对象的引用 |
__init__ | 创建对象时自动调用,初始化属性 |
__str__ | print(对象)时自动调用 |
__del__ | 对象销毁时自动调用 |
| 继承 | 子类继承父类的属性和行为 |
| 多继承 | 从左往右,就近原则 |
9.2 创建类的三种格式
# 格式1 class 类名: pass # 格式2 class 类名(): pass # 格式3(推荐) class 类名(object): # object 是所有类的父类 pass
9.3 访问方式总结
| 位置 | 访问方式 |
|---|---|
| 类外 | 对象名.成员 |
| 类内 | self.成员 |
📝最后提醒:面向对象编程是 Python 的核心编程范式,掌握好类与对象、继承、魔法方法等知识,你就能写出更加优雅、可维护的代码。多敲代码、多实践,自然就能熟练运用!
如果觉得有帮助,欢迎点赞、收藏、评论!😊
