第七章:面向对象编程——万物皆可“类”
1. 面向对象:从“上帝视角”看代码
各位少侠,恭喜你坚持到了这里!前六章你学的叫“面向过程”,就像写菜谱,第一步切菜,第二步开火,第三步下锅。这种写法处理简单任务没问题,但如果要开发一个大型游戏,里面有几百个角色、几千种道具,面向过程就会让你陷入逻辑的泥潭。
这时候,我们需要切换视角,进入**面向对象编程(OOP)**的世界。
OOP的核心思想是:把现实世界的事物抽象成代码。
- 类(Class):就是“图纸”或者“模具”。比如“汽车设计图”。
- 对象(Object):就是根据图纸造出来的“实物”。比如“那一辆红色的法拉利”。
有了“汽车”这个类,你想造多少辆车都可以,每一辆都是独立的对象,但它们都遵循同一套图纸。
2. 类的解剖:属性与方法
在Python中,定义一个类用 class 关键字。类里面主要包含两样东西:
- 属性(Attribute):描述这个东西“长什么样”(变量)。
- 方法(Method):描述这个东西“能干什么”(函数)。
python
class Hero:
# 初始化方法(构造函数):每次造新英雄时,自动执行这里
def __init__(self, name, hp):
self.name = name # 属性:名字
self.hp = hp # 属性:血量
# 方法:攻击
def attack(self, enemy):
print(f"{self.name} 攻击了 {enemy.name}!")
enemy.hp -= 10
print(f"{enemy.name} 掉了10点血,还剩 {enemy.name} 还有 {enemy.hp} 血。")
# 实例化对象(造英雄)
gailun = Hero("盖伦", 500)
yasuo = Hero("亚索", 400)
# 调用方法
gailun.attack(yasuo)
# 输出:盖伦 攻击了 亚索!
# 输出:亚索 掉了10点血,还剩 亚索 还有 390 血。
看到那个 self 了吗?它代表“我自己”。self.name 就是“我自己的名字”。在类的方法里,第一个参数永远必须是 self,这是Python的规矩。
3. 面向对象的三大“神功”
为什么大厂面试必问OOP?因为它有三大特性,能解决复杂系统的维护问题:
封装(Encapsulation)
把数据(属性)和操作数据的代码(方法)打包在一起,并且把不想让别人乱改的数据藏起来。
比如,你不能直接修改英雄的 hp 为 -100,你可以把 hp 设为私有(前面加两个下划线 __hp),然后提供一个 set_hp() 方法来控制修改逻辑(比如限制最小值为0)。
继承(Inheritance)
代码复用的神器。
假设你要写一个“法师”类,他也有名字和血量,但他有魔法值。你不需要重写一遍,直接继承 Hero 类即可:
python
class Mage(Hero): # 括号里写父类
def __init__(self, name, hp, mp):
super().__init__(name, hp) # 继承父类的名字和血量
self.mp = mp # 新增魔法值属性
def cast_spell(self):
print(f"{self.name} 释放了大火球!消耗了魔法值。")
Mage 自动拥有了 Hero 的所有功能,还能扩展自己的新功能。
多态(Polymorphism)
同一个接口,不同的实现。
比如 Hero 类有个 attack 方法,Mage 类可以重写这个方法,改成“释放火球”。当你调用 attack 时,如果是盖伦,他就挥剑;如果是法师,他就扔火球。程序不需要知道具体是谁,只要知道它是英雄,就能攻击。
4. 什么时候用面向对象?
别为了用而用。
- 如果你的程序只是简单的脚本,比如批量重命名文件,用函数(面向过程)更简单直接。
- 如果你的程序涉及很多实体,比如游戏角色、电商系统的用户/订单/商品,或者代码量很大需要多人协作,必须用面向对象。它能让你像搭积木一样管理庞大的系统。
5. 本章小结与课后“折磨”
面向对象是编程思维的一次飞跃。从“怎么做”变成了“谁来做”。
课后小挑战:
- 定义一个
Dog类,属性有name和breed(品种),方法有bark()(打印“汪汪汪”)。 - 实例化两只不同的狗,分别调用它们的
bark()方法。 - 定义一个
Cat类,继承自Animal类(你需要先定义一个基础的Animal类),重写speak()方法,让猫叫“喵喵喵”。
敲完代码,恭喜你,你已经摸到了软件架构师的门槛!下一节,我们将学习如何让程序与外部世界交互——文件操作与异常处理,别让你的程序因为一个小错误就原地爆炸!
本文由 AI 辅助生成
参考资料:
- Python官方面向对象教程:https://docs.python.org/zh-cn/3/tutorial/classes.html
- Real Python面向对象编程指南:https://realpython.com/python3-object-oriented-programming/
- 菜鸟教程Python3面向对象:https://www.runoob.com/python3/python3-class.html