✨ 第8天:魔法学院的咒语构造术:面向对象编程基础 ✨
✨ 欢迎来到霍格沃茨魔法学院的编程分院!今天,我们将揭开面向对象编程的神秘面纱,这是一种能够让你的代码像魔法一样组织有序、强大灵活的编程思想。在Python的魔法世界里,掌握这种技艺将让你成为一名真正的编程巫师!
🔮 今日魔法学习目标
通过今天的学习,你将掌握以下魔法技能:
- 📚 理解咒语书(类)和魔法卷轴(对象)的基本概念
- 🎭 掌握四大高级魔法特性:封装、继承、多态和抽象
- 🪄 学会使用神奇的魔法方法(魔术方法)
- 🎮 能够创建自己的魔法类并实例化对象
- 🏰 能够运用面向对象编程思想构建一个简单的魔法银行系统
🧙♂️ 魔法知识小调查
💭 在魔法世界中,你觉得哪种魔法物品最能代表面向对象编程的思想?是可以定制内容的魔法书,还是能够执行特定功能的魔法物品?在评论区分享你的想法吧!
🧪 什么是面向对象编程魔法?
面向对象编程(OOP)是一种以"对象"为中心的编程思想,就像魔法世界里的咒语书和魔法物品一样。它将数据和操作数据的方法封装在一个称为"类"的魔法容器中,通过创造这个容器的实例(对象)来施展各种神奇的功能。
魔法师的比喻:
- 类(Class)就像是一本珍贵的"咒语书模板",它记载了某种魔法应该包含哪些元素(数据)和能够实现什么效果(方法)。
- 对象(Object)则是根据这个模板抄写出来的具体"魔法卷轴",你可以用它来施展书中描述的各种咒语。
📜 咒语书(类)与魔法卷轴(对象)的基本概念
咒语书(类)
类是面向对象编程的基本魔法单元,是一种巫师自定义的魔法类型,包含魔法属性(数据)和魔法方法(函数)。
咒语书的组成:
- 魔法属性(Attributes): 描述魔法的基本特征。例如,"变形术"可能有变形对象、变形目标、魔法强度等属性。
- 魔法方法(Methods): 咒语书中记载的具体法术。例如,"变形术"可能有启动变形、维持变形、解除变形等方法。
魔法卷轴(对象)
魔法卷轴是咒语书的实例,是根据咒语书创造出来的具体魔法物品。一本咒语书可以创造出无数张魔法卷轴。
魔法卷轴的特点:
- 每张卷轴都有自己独特的魔法属性值。
- 每张卷轴都可以施展咒语书中记载的所有魔法。
🎬 魔法师小剧场
🧙♂️ 老魔法师:"年轻的学徒,你手中拿的是什么?"
🧝♂️ 精灵学徒:"这是一本变形术咒语书!我可以用它创造出无数张变形术卷轴!"
🧙♂️ 老魔法师:"很好!每张卷轴都能施展相同的变形魔法,但可以变形不同的物体。这,就是面向对象编程的精髓!"
✨ 在Python魔法世界中编写咒语书
在Python魔法世界里,我们使用class咒语来定义一本新的咒语书。
基本咒语格式
class 咒语书名称:
# 共享魔法能量(类变量,所有卷轴共享)
共享魔法能量 = "无限魔力"
# 卷轴激活咒语(初始化方法/构造函数)
def __init__(self, 参数1, 参数2, ...):
# 卷轴专属魔法印记(实例变量,每个卷轴独有)
self.魔法印记1 = 参数1
self.魔法印记2 = 参数2
# 魔法方法
def 魔法名称(self, 参数1, 参数2, ...):
# 施展魔法的具体步骤
pass魔法师的笔记:
class 咒语书名称:创造了一本名为咒语书名称的魔法书。按照魔法师的传统,咒语书名称通常使用大驼峰命名法(如变形术、飞行咒)。__init__咒语是一个特殊的魔法,当创造魔法卷轴时会自动念诵,用来为卷轴注入初始魔力。self参数是每个魔法方法的第一个印记,它代表使用该魔法的魔法卷轴本身。通过self,可以在魔法内部访问卷轴的所有属性和其他魔法。
创造魔法卷轴
要创造一张魔法卷轴,只需使用咒语书名称后跟魔法括号,传入__init__咒语所需的魔法材料即可。
# 创造魔法卷轴
魔法卷轴名称 = 咒语书名称(材料1, 材料2, ...)🚀 施展第一个面向对象魔法
让我们通过一个简单的魔法例子来理解咒语书和魔法卷轴的概念。
# 定义一本变形术咒语书
class 变形术:
# 共享魔法能量(类变量)
魔法来源 = "变形学院"
# 卷轴激活咒语
def __init__(self, 原物体, 目标形态, 施法者):
# 卷轴专属魔法印记
self.原物体 = 原物体
self.目标形态 = 目标形态
self.施法者 = 施法者
self.变形状态 = False # 初始状态为未变形
# 魔法方法:启动变形
def 启动变形(self):
self.变形状态 = True
print(f"{self.施法者}施展变形术,将{self.原物体}变成了{self.目标形态}!")
# 魔法方法:增强变形效果
def 增强变形(self, 魔力值):
if self.变形状态:
print(f"{self.施法者}注入了{魔力值}点魔力,变形更加稳定了!")
else:
print("请先启动变形术!")
# 魔法方法:解除变形
def 解除变形(self):
if self.变形状态:
self.变形状态 = False
print(f"{self.施法者}解除了变形术,{self.目标形态}变回了{self.原物体}。")
else:
print("没有正在进行的变形术!")
# 创造变形术卷轴
哈利的变形术 = 变形术("老鼠", "茶杯", "哈利·波特")
# 施展魔法
哈利的变形术.启动变形() # 输出: 哈利·波特施展变形术,将老鼠变成了茶杯!
哈利的变形术.增强变形(50) # 输出: 哈利·波特注入了50点魔力,变形更加稳定了!
哈利的变形术.解除变形() # 输出: 哈利·波特解除了变形术,茶杯变回了老鼠。
# 查看魔法卷轴的属性
print(f"这个变形术卷轴记录了:将{哈利的变形术.原物体}变成{哈利的变形术.目标形态},由{哈利的变形术.施法者}施展")
# 输出: 这个变形术卷轴记录了:将老鼠变成茶杯,由哈利·波特施展
# 查看咒语书的共享魔法
print(f"变形术的魔法来源: {变形术.魔法来源}") # 通过咒语书查看
print(f"变形术的魔法来源: {哈利的变形术.魔法来源}") # 通过魔法卷轴查看🧠 魔法师小测试:咒语书与魔法卷轴
问题:在面向对象编程中,咒语书(类)和魔法卷轴(对象)的关系是什么?
A. 一个咒语书只能创建一个魔法卷轴 B. 一个咒语书可以创建多个魔法卷轴,每个卷轴都有相同的属性值 C. 一个咒语书可以创建多个魔法卷轴,每个卷轴可以有不同的属性值 D. 咒语书和魔法卷轴没有关系
把你的答案写在评论区,看看谁是今天的面向对象小专家!
🎭 四大高级魔法特性
在面向对象的魔法世界中,有四种强大的高级魔法特性,掌握它们将让你成为真正的编程大师!
1. 魔法封印(封装,Encapsulation)
封装是一种将魔法核心秘密隐藏起来的法术,只有通过特定的魔法接口才能访问。在Python魔法世界中,我们使用魔法下划线来标记需要保密的魔法:
- 以单下划线
_开头的魔法表示"内部使用的小魔法",不建议外部直接调用。 - 以双下划线
__开头的魔法会被施加特殊的隐藏咒语(名称修饰),实际上变成了_咒语书名称__魔法名称,更难被外部发现。
class 魔法宝箱:
def __init__(self, 主人, 宝物):
self.主人 = 主人 # 公共信息
self._守卫咒语 = "初级防护咒" # 内部魔法(约定)
self.__宝物 = 宝物 # 核心秘密(魔法隐藏)
def 查看宝物(self):
return f"{self.主人}的宝箱中藏着{self.__宝物}"
def 更换宝物(self, 新宝物):
self.__宝物 = 新宝物
print("宝物已更换!")
宝箱 = 魔法宝箱("赫敏", "时光转换器")
print(宝箱.主人) # 可以查看
print(宝箱._守卫咒语) # 技术上可以查看,但按照魔法师的约定不应该这样做
# print(宝箱.__宝物) # 会触发魔法防御,引发AttributeError错误
print(宝箱.查看宝物()) # 正确的查看方式:通过魔法接口
宝箱.更换宝物("复方汤剂") # 正确的更换方式:通过魔法接口2. 魔法传承(继承,Inheritance)
继承是一种强大的魔法传承方式,新的咒语书(子类)可以继承古老咒语书(父类)的所有魔法和特性,并可以添加自己的独特魔法,或改进古老的魔法。
基本咒语格式:
class 新咒语书(古老咒语书):
# 新咒语书的定义
pass魔法传承示例:
# 古老的魔法书:魔法生物
class 魔法生物:
def __init__(self, 名称):
self.名称 = 名称
def 发出声音(self):
print("魔法生物发出声音。")
# 传承自魔法生物的新咒语书:家养小精灵
class 家养小精灵(魔法生物):
def 发出声音(self): # 改进古老的魔法
print("主人,有什么吩咐?")
def 施展魔法(self): # 添加新魔法
print("小精灵默默施展了清洁魔法。")
# 传承自魔法生物的新咒语书:凤凰
class 凤凰(魔法生物):
def 发出声音(self): # 改进古老的魔法
print("凤凰发出清脆的歌声。")
def 重生(self): # 添加新魔法
print("凤凰浴火重生!")
# 创建新咒语书的魔法卷轴
多比 = 家养小精灵("多比")
福克斯 = 凤凰("福克斯")
# 施展传承的魔法
多比.发出声音() # 输出: 主人,有什么吩咐?
多比.施展魔法() # 输出: 小精灵默默施展了清洁魔法。
福克斯.发出声音() # 输出: 凤凰发出清脆的歌声。
福克斯.重生() # 输出: 凤凰浴火重生!3. 变形魔法(多态,Polymorphism)
多态是一种高级变形魔法,它允许不同类型的魔法生物对同一个魔法指令做出不同的反应。在Python魔法世界中,多态是自然发生的,不需要额外的变形咒语。
变形魔法示例:
def 与魔法生物交流(生物):
生物.发出声音() # 同样的指令,不同的生物会有不同的反应
# 使用前面定义的魔法生物、家养小精灵和凤凰
多比 = 家养小精灵("多比")
福克斯 = 凤凰("福克斯")
# 施展多态魔法
与魔法生物交流(多比) # 输出: 主人,有什么吩咐?
与魔法生物交流(福克斯) # 输出: 凤凰发出清脆的歌声。4. 幻影魔法(抽象,Abstraction)
抽象是一种创造幻影模板的魔法,它只定义魔法的接口,而不实现具体的施法细节。在Python魔法世界中,我们可以使用abc魔法卷轴(Abstract Base Classes)来创建抽象咒语书。
幻影魔法示例:
from abc import ABC, abstractmethod
# 抽象咒语书:魔法武器
class 魔法武器(ABC):
@abstractmethod
def 攻击(self): # 只定义攻击接口,不实现具体方法
pass
@abstractmethod
def 防御(self): # 只定义防御接口,不实现具体方法
pass
# 具体咒语书:魔杖
class 魔杖(魔法武器):
def 攻击(self):
return "魔杖射出一道咒语光束!"
def 防御(self):
return "魔杖形成一道魔法护盾!"
# 具体咒语书:飞天扫帚
class 飞天扫帚(魔法武器):
def 攻击(self):
return "飞天扫帚高速撞击敌人!"
def 防御(self):
return "飞天扫帚快速闪避!"
# 创建具体咒语书的魔法卷轴
哈利的魔杖 = 魔杖()
光轮2000 = 飞天扫帚()
print(哈利的魔杖.攻击()) # 输出: 魔杖射出一道咒语光束!
print(光轮2000.防御()) # 输出: 飞天扫帚快速闪避!🎬 魔法师小剧场
🧙♂️ 老魔法师:"年轻的学徒,你为何叹气?"
🧝♂️ 精灵学徒:"我想创建一个新的魔法生物,但从头开始写所有的法术太麻烦了..."
🧙♂️ 老魔法师:"那你为何不使用魔法传承呢?你可以继承现有的魔法生物类,然后只添加或修改你需要的法术!"
🧝♂️ 精灵学徒:"哦,对啊!这样可以省去很多重复的工作!谢谢您,大师!"
🪄 神奇的魔法方法(魔术方法)
在Python魔法世界中,存在着许多以双下划线开头和结尾的特殊魔法,这些被称为魔法方法(Magic Methods)或双下方法(Dunder Methods)。当特定的魔法情况发生时,这些方法会被自动激活。
常用的魔法方法
| 魔法名称 | 魔法效果 | 触发时机 |
|---|---|---|
__init__ | 魔法卷轴激活 | 创建魔法卷轴时 |
__str__ | 显示魔法卷轴的外貌 | 使用str()魔法或print()魔法时 |
__repr__ | 显示魔法卷轴的真实身份 | 在魔法水晶球(交互式解释器)中直接观察魔法卷轴时 |
__len__ | 测量魔法卷轴的长度 | 使用len()魔法时 |
__getitem__ | 从魔法卷轴中获取信息 | 使用魔法卷轴[索引]语法时 |
__setitem__ | 在魔法卷轴中写入信息 | 使用魔法卷轴[索引] = 信息语法时 |
__delitem__ | 从魔法卷轴中删除信息 | 使用del 魔法卷轴[索引]语法时 |
__eq__ | 比较两个魔法卷轴是否相同 | 使用==魔法时 |
__lt__ | 判断一个魔法卷轴是否弱于另一个 | 使用<魔法时 |
__gt__ | 判断一个魔法卷轴是否强于另一个 | 使用>魔法时 |
示例:创建一个魔法咒语书库
class 魔法咒语书库:
def __init__(self):
self.咒语书列表 = []
def 添加咒语书(self, 咒语书):
self.咒语书列表.append(咒语书)
print(f"{咒语书}已添加到咒语书库!")
def __str__(self):
return f"魔法咒语书库中包含{len(self.咒语书列表)}本咒语书:{', '.join(self.咒语书列表)}"
def __len__(self):
return len(self.咒语书列表)
def __getitem__(self, 索引):
return self.咒语书列表[索引]
def __setitem__(self, 索引, 新咒语书):
self.咒语书列表[索引] = 新咒语书
print(f"咒语书库第{索引+1}个位置已更新为{新咒语书}!")
def __delitem__(self, 索引):
删除的咒语书 = self.咒语书列表[索引]
del self.咒语书列表[索引]
print(f"{删除的咒语书}已从咒语书库中移除!")
# 创建魔法咒语书库
霍格沃茨图书馆 = 魔法咒语书库()
# 添加咒语书
霍格沃茨图书馆.添加咒语书("标准咒语,初级版")
霍格沃茨图书馆.添加咒语书("黑魔法防御术指南")
霍格沃茨图书馆.添加咒语书("高级变形术")
# 使用__str__魔法
print(霍格沃茨图书馆) # 输出: 魔法咒语书库中包含3本咒语书:标准咒语,初级版, 黑魔法防御术指南, 高级变形术
# 使用__len__魔法
print(f"图书馆中共有{len(霍格沃茨图书馆)}本咒语书") # 输出: 图书馆中共有3本咒语书
# 使用__getitem__魔法
print(f"第一本咒语书是:{霍格沃茨图书馆[0]}") # 输出: 第一本咒语书是:标准咒语,初级版
# 使用__setitem__魔法
霍格沃茨图书馆[1] = "神奇动物在哪里"
# 使用__delitem__魔法
del 霍格沃茨图书馆[0]
# 再次查看图书馆
print(霍格沃茨图书馆) # 输出: 魔法咒语书库中包含2本咒语书:神奇动物在哪里, 高级变形术🎮 魔法师的实践任务
现在,是时候展示你的魔法天赋了!请完成以下实践任务:
任务: 创建一个魔法银行账户类,实现以下魔法功能:
- 初始化魔法账户,设置账户名和初始魔法金币(默认为0)
- 存款魔法:向账户中添加魔法金币
- 取款魔法:从账户中取出魔法金币(金币不足时提示)
- 查询魔法:查看账户当前魔法金币数量
- 显示魔法:展示账户的完整信息
魔法框架:
class 魔法银行账户:
def __init__(self, 账户名, 金币=0):
# 实现初始化魔法
pass
def 存款(self, 数量):
# 实现存款魔法
pass
def 取款(self, 数量):
# 实现取款魔法
pass
def 查询余额(self):
# 实现查询魔法
pass
def 显示信息(self):
# 实现显示魔法
pass
# 测试魔法
赫敏的账户 = 魔法银行账户("赫敏·格兰杰", 1000)
赫敏的账户.显示信息()
赫敏的账户.存款(500)
赫敏的账户.显示信息()
赫敏的账户.取款(200)
赫敏的账户.显示信息()
赫敏的账户.取款(2000) # 应该提示金币不足答案提示: 参考之前的变形术咒语书例子,你需要为魔法银行账户类定义属性和方法。
挑战升级: 如果你想挑战更高级的魔法,可以添加以下功能:
- 账户之间的转账魔法
- 利息计算魔法
- 交易历史记录魔法
🧠 魔法师小测试:面向对象编程知识
让我们来做一个小测试,检验一下你今天学到的面向对象编程魔法知识!
1. 在Python中,如何定义一个类?(单选) A. 使用function关键字 B. 使用class关键字 C. 使用def关键字 D. 使用import关键字
2. 以下哪个魔法方法用于初始化对象?(单选) A. __init__ B. __str__ C. __repr__ D. __len__
3. 面向对象编程的四大高级特性不包括以下哪一项?(单选) A. 封装 B. 继承 C. 多态 D. 递归
4. 在Python中,如何表示一个内部使用的属性?(单选) A. 以$开头 B. 以#开头 C. 以_开头 D. 以&开头
5. 多态的主要特点是什么?(单选) A. 同一个方法可以对不同对象有不同的行为 B. 一个类可以有多个实例 C. 一个方法可以有多个参数 D. 一个对象可以有多个属性
答案会在明天的课程中公布!你可以在评论区写下你的答案,看看谁是今天的面向对象编程小能手!
📝 今日魔法总结
今天,我们在霍格沃茨的编程分院学习了面向对象编程的基础魔法知识:
- ✨ 咒语书与魔法卷轴:了解了类和对象的基本概念,以及它们如何共同工作
- 🎭 四大高级魔法特性:掌握了封装、继承、多态和抽象的概念和使用方法
- 🪄 神奇的魔法方法:认识了Python中特殊的双下划线方法,它们可以赋予对象神奇的能力
- 🎮 魔法实践:通过创建魔法银行账户类的任务,巩固了所学知识
面向对象编程是一种非常强大的魔法,它可以帮助我们更好地组织和管理复杂的魔法代码,提高代码的重用性和可维护性。
🔮 明日预告
下一节课,我们将深入探索09-面向对象编程高级特性,学习更多强大的法术,如属性装饰器、类方法、静态方法、魔法方法的高级用法等。敬请期待!🚀
今天的魔法课程就到这里啦!如果你有任何疑问,欢迎在评论区留言。祝你魔法学习愉快!✨




