目录
一、面向对象编程思想
1.1 两种编程范式
- 面向过程:关注"如何做"的步骤化思维(如:第一步打开冰箱,第二步放入大象)
- 面向对象:关注"谁来做"的对象化思维(如:冰箱.开门(),大象.进入())
核心区别:
- 面向过程是解决问题的"步骤说明书"
- 面向对象是模拟现实世界的"对象交互模型"
生活案例:洗衣服
- 面向过程:拿盆→加水→放衣服→搓洗→晾干
- 面向对象:人.操作(洗衣机),洗衣机.清洗(衣服)
1.2 面向对象的优势
- 更贴近人类思维模式
- 提高代码复用性和可维护性
- 便于构建复杂系统
- 支持模块化开发
二、类与对象:万物皆对象
2.1 核心概念
概念 | 说明 | 现实比喻 |
---|---|---|
类 | 抽象模板/蓝图 | 汽车设计图纸 |
对象 | 类的具体实例 | 根据图纸造的汽车 |
属性 | 对象的特征(名词) | 颜色、型号 |
方法 | 对象的行为(动词) | 加速、刹车 |
2.2 定义类与创建对象
# 定义汽车类
class Car:
# 方法:定义对象行为
def run(self):
print("汽车正在行驶...")
# 创建对象实例
my_car = Car()
my_car.run() # 调用方法
2.3 self关键字的秘密
self
指向当前对象实例- 用于区分不同对象的属性和方法
- 在类内部访问成员时必须使用
-
一个类可以实例化多个对象,用于区分哪个对象调用了类的方法
class Car:
def start_engine(self):
print("引擎启动")
self.drive() # 通过self调用其他方法
def drive(self):
print("汽车行驶中")
三、属性操作:对象的特征管理
3.1 添加与访问属性
# 类外部添加属性
my_car.color = "红色"
my_car.wheels = 4
# 类内部访问属性
class Car:
def show_info(self):
print(f"颜色: {self.color}, 轮胎数: {self.wheels}")
3.2 初始化属性:__init__()
魔法方法
- 创建对象时自动调用
- 用于初始化对象属性
- 支持参数化初始化
class Car:
def __init__(self, color, wheels):
self.color = color # 初始化颜色属性
self.wheels = wheels # 初始化轮胎属性
def show_info(self):
print(f"一辆{self.color}的汽车,有{self.wheels}个轮胎")
# 创建对象时初始化属性
my_car = Car("蓝色", 4)
my_car.show_info()
四、魔法方法:Python的黑魔法
在python中,有一类方法是用来对python类的功能进行加强(扩展)操作的,并且这一类方法不需要手动触发(自动触发)
4.1 __str__()
:对象的人类可读表示
__str__():用于快速打印对象的各个属性值的,在输出语句打印对象时会自动执行
class Car:
def __init__(self, color, wheels):
self.color = color
self.wheels = wheels
def __str__(self):
return f"Car: {self.color}, {self.wheels}轮"
my_car = Car("黑色", 4)
print(my_car) # 输出: Car: 黑色, 4轮
4.2 __del__()
:对象销毁时的清理
__del__():当对象被删除或者文件执行结束完毕后,会自动的调用
class Car:
def __del__(self):
print("汽车对象已被销毁")
# 使用示例
car = Car()
del car # 输出: 汽车对象已被销毁
魔法方法总结表
方法 | 触发时机 | 常用场景 |
---|---|---|
__init__() | 创建对象时 | 属性初始化 |
__str__() | print()或str()调用时 | 返回可读的对象描述 |
__del__() | 对象销毁时 | 资源释放、清理操作 |
五、综合实战案例
5.1 案例一:减肥追踪器
class Person:
def __init__(self, name, initial_weight):
self.name = name
self.weight = initial_weight
def run(self):
self.weight -= 0.5
print(f"{self.name}跑步一次,体重减至{self.weight}kg")
def eat(self):
self.weight += 2
print(f"{self.name}大吃一顿,体重增至{self.weight}kg")
def __str__(self):
return f"{self.name}当前体重: {self.weight}kg"
# 使用示例
xiaoming = Person("小明", 100)
print(xiaoming) # 小明当前体重: 100kg
xiaoming.run() # 小明跑步一次,体重减至99.5kg
xiaoming.eat() # 小明大吃一顿,体重增至101.5kg
5.2 案例二:烤地瓜模拟器
class SweetPotato:
def __init__(self):
self.cook_time = 0
self.state = "生的"
self.condiments = []
def cook(self, minutes):
self.cook_time += minutes
if self.cook_time < 3:
self.state = "生的"
elif self.cook_time < 5:
self.state = "半生不熟"
elif self.cook_time < 8:
self.state = "熟了"
else:
self.state = "烤糊了"
print(f"烤了{minutes}分钟,当前状态: {self.state}")
def add_condiment(self, name):
self.condiments.append(name)
print(f"添加调料: {name}")
def __str__(self):
return f"地瓜状态: {self.state}, 总时长: {self.cook_time}分钟, 调料: {', '.join(self.condiments)}"
# 使用示例
potato = SweetPotato()
print(potato) # 地瓜状态: 生的, 总时长: 0分钟, 调料:
potato.cook(2) # 烤了2分钟,当前状态: 生的
potato.cook(3) # 烤了3分钟,当前状态: 半生不熟
potato.add_condiment("辣椒粉")
potato.add_condiment("孜然")
print(potato) # 地瓜状态: 半生不熟, 总时长: 5分钟, 调料: 辣椒粉, 孜然
六、面向对象编程最佳实践
- 单一职责原则:每个类只负责一项功能
- 合理使用初始化:在
__init__
中设置必要属性 - 封装数据:通过方法操作属性,而非直接访问
- 利用魔法方法:增强类的表现力和功能性
- 命名规范:类名使用大驼峰,方法使用小写蛇形
"面向对象不是万能的,但没有面向对象是万万不能的"
- 在构建复杂系统、GUI程序、游戏开发时,面向对象会展现出强大威力
- 对于简单脚本,面向过程可能更直接高效