👑 面向对象编程教程
就像在王者荣耀中创建和操作英雄角色,这里我们将学习Python面向对象编程的核心概念!
🏰 类和对象 - 英雄蓝图
💡 游戏比喻
类就像英雄的蓝图,定义了英雄的基本属性和技能。对象就是根据这个蓝图创建的具体英雄实例。
📝 类定义语法
class 类名:
# 初始化方法(构造函数)
def __init__(self, 参数1, 参数2, ...):
self.属性1 = 参数1
self.属性2 = 参数2
# ... 其他初始化代码
# 实例方法
def 方法名(self, 参数):
# 方法实现
pass
# 初始化方法(构造函数)
def __init__(self, 参数1, 参数2, ...):
self.属性1 = 参数1
self.属性2 = 参数2
# ... 其他初始化代码
# 实例方法
def 方法名(self, 参数):
# 方法实现
pass
🏰 定义英雄类
# 定义英雄类(蓝图)
class Hero:
# 初始化方法 - 创建英雄时的设置
def __init__(self, 名字, 职业, 生命值, 攻击力):
self.名字 = 名字
self.职业 = 职业
self.生命值 = 生命值
self.攻击力 = 攻击力
self.等级 = 1
# 实例方法 - 英雄行为
def 攻击(self, 目标):
print(f"{self.名字}对{目标}发动攻击!")
return self.攻击力
def 升级(self):
self.等级 += 1
self.生命值 += 50
self.攻击力 += 10
print(f"{self.名字}升级到{self.等级}级!")
class Hero:
# 初始化方法 - 创建英雄时的设置
def __init__(self, 名字, 职业, 生命值, 攻击力):
self.名字 = 名字
self.职业 = 职业
self.生命值 = 生命值
self.攻击力 = 攻击力
self.等级 = 1
# 实例方法 - 英雄行为
def 攻击(self, 目标):
print(f"{self.名字}对{目标}发动攻击!")
return self.攻击力
def 升级(self):
self.等级 += 1
self.生命值 += 50
self.攻击力 += 10
print(f"{self.名字}升级到{self.等级}级!")
🏰 创建英雄对象
# 创建具体的英雄对象(实例)
# 创建赵云对象
赵云 = Hero("赵云", "战士", 1000, 80)
# 创建貂蝉对象
貂蝉 = Hero("貂蝉", "法师", 800, 120)
# 访问对象属性
print(f"英雄:{赵云.名字}")
print(f"职业:{赵云.职业}")
print(f"生命值:{赵云.生命值}")
# 调用对象方法
伤害 = 赵云.攻击("敌人")
print(f"造成{伤害}点伤害")
赵云.升级()
print(f"升级后攻击力:{赵云.攻击力}")
# 创建赵云对象
赵云 = Hero("赵云", "战士", 1000, 80)
# 创建貂蝉对象
貂蝉 = Hero("貂蝉", "法师", 800, 120)
# 访问对象属性
print(f"英雄:{赵云.名字}")
print(f"职业:{赵云.职业}")
print(f"生命值:{赵云.生命值}")
# 调用对象方法
伤害 = 赵云.攻击("敌人")
print(f"造成{伤害}点伤害")
赵云.升级()
print(f"升级后攻击力:{赵云.攻击力}")
🔄 封装 - 英雄属性保护
💡 游戏比喻
封装就像英雄的装备栏,外部只能通过特定接口(方法)来访问和修改英雄的属性,保护数据安全。
🛡️ 私有属性
# 使用私有属性保护英雄数据
class ProtectedHero:
def __init__(self, 名字, 职业):
self.名字 = 名字
self.职业 = 职业
self.__生命值 = 1000 # 私有属性
self.__攻击力 = 80 # 私有属性
# 公共方法访问私有属性
def 获取生命值(self):
return self.__生命值
def 设置生命值(self, 新生命值):
if 新生命值 >= 0:
self.__生命值 = 新生命值
else:
print("生命值不能为负数!")
def 受到伤害(self, 伤害值):
self.__生命值 -= 伤害值
if self.__生命值 <= 0:
print(f"{self.名字}被击败了!")
else:
print(f"{self.名字}剩余生命值:{self.__生命值}")
# 使用封装后的英雄
关羽 = ProtectedHero("关羽", "战士")
# 正确方式访问属性
print(f"关羽生命值:{关羽.获取生命值()}")
关羽.受到伤害(300)
# 错误方式(会报错)
# print(关羽.__生命值) # 无法直接访问私有属性
class ProtectedHero:
def __init__(self, 名字, 职业):
self.名字 = 名字
self.职业 = 职业
self.__生命值 = 1000 # 私有属性
self.__攻击力 = 80 # 私有属性
# 公共方法访问私有属性
def 获取生命值(self):
return self.__生命值
def 设置生命值(self, 新生命值):
if 新生命值 >= 0:
self.__生命值 = 新生命值
else:
print("生命值不能为负数!")
def 受到伤害(self, 伤害值):
self.__生命值 -= 伤害值
if self.__生命值 <= 0:
print(f"{self.名字}被击败了!")
else:
print(f"{self.名字}剩余生命值:{self.__生命值}")
# 使用封装后的英雄
关羽 = ProtectedHero("关羽", "战士")
# 正确方式访问属性
print(f"关羽生命值:{关羽.获取生命值()}")
关羽.受到伤害(300)
# 错误方式(会报错)
# print(关羽.__生命值) # 无法直接访问私有属性
🛡️ 属性装饰器
# 使用@property装饰器实现更优雅的封装
class SmartHero:
def __init__(self, 名字):
self._名字 = 名字
self._等级 = 1
self._经验值 = 0
# 使用@property装饰器
@property
def 名字(self):
return self._名字
@property
def 等级(self):
return self._等级
@property
def 经验值(self):
return self._经验值
@经验值.setter
def 经验值(self, 值):
if 值 >= 0:
self._经验值 = 值
# 自动升级逻辑
while self._经验值 >= self._等级 * 100:
self._经验值 -= self._等级 * 100
self._等级 += 1
print(f"{self._名字}升级到{self._等级}级!")
# 使用智能英雄
张飞 = SmartHero("张飞")
# 像访问属性一样使用
print(f"英雄:{张飞.名字}")
print(f"当前等级:{张飞.等级}")
# 设置经验值(会自动触发升级)
张飞.经验值 = 350
print(f"升级后等级:{张飞.等级}")
class SmartHero:
def __init__(self, 名字):
self._名字 = 名字
self._等级 = 1
self._经验值 = 0
# 使用@property装饰器
@property
def 名字(self):
return self._名字
@property
def 等级(self):
return self._等级
@property
def 经验值(self):
return self._经验值
@经验值.setter
def 经验值(self, 值):
if 值 >= 0:
self._经验值 = 值
# 自动升级逻辑
while self._经验值 >= self._等级 * 100:
self._经验值 -= self._等级 * 100
self._等级 += 1
print(f"{self._名字}升级到{self._等级}级!")
# 使用智能英雄
张飞 = SmartHero("张飞")
# 像访问属性一样使用
print(f"英雄:{张飞.名字}")
print(f"当前等级:{张飞.等级}")
# 设置经验值(会自动触发升级)
张飞.经验值 = 350
print(f"升级后等级:{张飞.等级}")
🔗 继承 - 英雄职业体系
💡 游戏比喻
继承就像英雄的职业体系,战士、法师、射手等职业都继承自基础的英雄类,但各自有独特的技能和属性。
⚔️ 单继承
# 基础英雄类
class BaseHero:
def __init__(self, 名字, 生命值, 攻击力):
self.名字 = 名字
self.生命值 = 生命值
self.攻击力 = 攻击力
def 攻击(self):
print(f"{self.名字}发动基础攻击")
return self.攻击力
# 战士类继承基础英雄
class Warrior(BaseHero):
def __init__(self, 名字):
# 调用父类的初始化方法
super().__init__(名字, 1200, 100)
self.防御力 = 50
# 战士特有的方法
def 狂暴(self):
self.攻击力 *= 1.5
print(f"{self.名字}进入狂暴状态!")
# 重写父类方法
def 攻击(self):
print(f"{self.名字}发动战士猛击!")
return self.攻击力 + 20
# 法师类继承基础英雄
class Mage(BaseHero):
def __init__(self, 名字):
super().__init__(名字, 800, 150)
self.魔法值 = 200
# 法师特有的方法
def 火球术(self):
if self.魔法值 >= 30:
self.魔法值 -= 30
print(f"{self.名字}释放火球术!")
return self.攻击力 * 2
else:
print("魔法值不足!")
return 0
# 使用继承体系
吕布 = Warrior("吕布")
诸葛亮 = Mage("诸葛亮")
# 测试继承功能
print(f"战士:{吕布.名字},生命值:{吕布.生命值}")
print(f"法师:{诸葛亮.名字},魔法值:{诸葛亮.魔法值}")
# 调用各自特有的方法
吕布.狂暴()
伤害 = 吕布.攻击()
print(f"吕布造成{伤害}点伤害")
魔法伤害 = 诸葛亮.火球术()
print(f"诸葛亮造成{魔法伤害}点魔法伤害")
class BaseHero:
def __init__(self, 名字, 生命值, 攻击力):
self.名字 = 名字
self.生命值 = 生命值
self.攻击力 = 攻击力
def 攻击(self):
print(f"{self.名字}发动基础攻击")
return self.攻击力
# 战士类继承基础英雄
class Warrior(BaseHero):
def __init__(self, 名字):
# 调用父类的初始化方法
super().__init__(名字, 1200, 100)
self.防御力 = 50
# 战士特有的方法
def 狂暴(self):
self.攻击力 *= 1.5
print(f"{self.名字}进入狂暴状态!")
# 重写父类方法
def 攻击(self):
print(f"{self.名字}发动战士猛击!")
return self.攻击力 + 20
# 法师类继承基础英雄
class Mage(BaseHero):
def __init__(self, 名字):
super().__init__(名字, 800, 150)
self.魔法值 = 200
# 法师特有的方法
def 火球术(self):
if self.魔法值 >= 30:
self.魔法值 -= 30
print(f"{self.名字}释放火球术!")
return self.攻击力 * 2
else:
print("魔法值不足!")
return 0
# 使用继承体系
吕布 = Warrior("吕布")
诸葛亮 = Mage("诸葛亮")
# 测试继承功能
print(f"战士:{吕布.名字},生命值:{吕布.生命值}")
print(f"法师:{诸葛亮.名字},魔法值:{诸葛亮.魔法值}")
# 调用各自特有的方法
吕布.狂暴()
伤害 = 吕布.攻击()
print(f"吕布造成{伤害}点伤害")
魔法伤害 = 诸葛亮.火球术()
print(f"诸葛亮造成{魔法伤害}点魔法伤害")
⚔️ 多继承
# 多继承示例 - 混合职业
# 基础技能类
class 战士技能:
def 猛击(self):
print("发动战士猛击!")
return 100
class 法师技能:
def 火球(self):
print("释放火球术!")
return 150
# 混合职业(多继承)
class 战斗法师(战士技能, 法师技能):
def __init__(self, 名字):
self.名字 = 名字
def 混合攻击(self):
print(f"{self.名字}发动混合攻击!")
物理伤害 = self.猛击()
魔法伤害 = self.火球()
return 物理伤害 + 魔法伤害
# 使用混合职业
混合英雄 = 战斗法师("魔战士")
总伤害 = 混合英雄.混合攻击()
print(f"混合攻击总伤害:{总伤害}")
# 基础技能类
class 战士技能:
def 猛击(self):
print("发动战士猛击!")
return 100
class 法师技能:
def 火球(self):
print("释放火球术!")
return 150
# 混合职业(多继承)
class 战斗法师(战士技能, 法师技能):
def __init__(self, 名字):
self.名字 = 名字
def 混合攻击(self):
print(f"{self.名字}发动混合攻击!")
物理伤害 = self.猛击()
魔法伤害 = self.火球()
return 物理伤害 + 魔法伤害
# 使用混合职业
混合英雄 = 战斗法师("魔战士")
总伤害 = 混合英雄.混合攻击()
print(f"混合攻击总伤害:{总伤害}")
🔮 多态 - 技能多样性
💡 游戏比喻
多态就像不同英雄使用相同的技能名称,但产生不同的效果。战士的"攻击"和法师的"攻击"虽然方法名相同,但实现方式不同。
✨ 方法重写
# 多态示例 - 不同英雄的攻击方式
class 游戏角色:
def 攻击(self):
pass # 抽象方法
class 战士(游戏角色):
def 攻击(self):
print("战士使用长剑猛砍!")
return 120
class 射手(游戏角色):
def 攻击(self):
print("射手使用弓箭射击!")
return 100
class 法师(游戏角色):
def 攻击(self):
print("法师吟唱魔法咒语!")
return 180
# 多态演示
def 执行攻击(角色):
# 同一个函数,不同对象产生不同行为
return 角色.攻击()
# 创建不同角色
角色列表 = [战士(), 射手(), 法师()]
# 统一调用攻击方法
for 角色 in 角色列表:
伤害 = 执行攻击(角色)
print(f"造成{伤害}点伤害\n")
class 游戏角色:
def 攻击(self):
pass # 抽象方法
class 战士(游戏角色):
def 攻击(self):
print("战士使用长剑猛砍!")
return 120
class 射手(游戏角色):
def 攻击(self):
print("射手使用弓箭射击!")
return 100
class 法师(游戏角色):
def 攻击(self):
print("法师吟唱魔法咒语!")
return 180
# 多态演示
def 执行攻击(角色):
# 同一个函数,不同对象产生不同行为
return 角色.攻击()
# 创建不同角色
角色列表 = [战士(), 射手(), 法师()]
# 统一调用攻击方法
for 角色 in 角色列表:
伤害 = 执行攻击(角色)
print(f"造成{伤害}点伤害\n")
✨ 鸭子类型
# Python的鸭子类型 - 关注行为而非类型
class 英雄:
def 攻击(self):
print("英雄发动攻击!")
return 100
class 怪物:
def 攻击(self):
print("怪物发动攻击!")
return 80
class 陷阱:
def 攻击(self):
print("陷阱触发攻击!")
return 60
# 鸭子类型:只要对象有攻击方法,就可以使用
def 处理攻击事件(攻击者):
# 不关心具体类型,只关心是否有攻击方法
if hasattr(攻击者, '攻击') and callable(getattr(攻击者, '攻击')):
return 攻击者.攻击()
else:
print("该对象无法攻击")
return 0
# 测试不同对象的攻击
攻击者列表 = [英雄(), 怪物(), 陷阱()]
for 攻击者 in 攻击者列表:
伤害 = 处理攻击事件(攻击者)
print(f"总伤害:{伤害}\n")
class 英雄:
def 攻击(self):
print("英雄发动攻击!")
return 100
class 怪物:
def 攻击(self):
print("怪物发动攻击!")
return 80
class 陷阱:
def 攻击(self):
print("陷阱触发攻击!")
return 60
# 鸭子类型:只要对象有攻击方法,就可以使用
def 处理攻击事件(攻击者):
# 不关心具体类型,只关心是否有攻击方法
if hasattr(攻击者, '攻击') and callable(getattr(攻击者, '攻击')):
return 攻击者.攻击()
else:
print("该对象无法攻击")
return 0
# 测试不同对象的攻击
攻击者列表 = [英雄(), 怪物(), 陷阱()]
for 攻击者 in 攻击者列表:
伤害 = 处理攻击事件(攻击者)
print(f"总伤害:{伤害}\n")
🏆 实战练习 - 完整英雄系统
💪 挑战任务
创建一个完整的英雄战斗系统,包含多种职业、技能和战斗机制。
# 完整的英雄战斗系统
class 游戏角色:
"""基础游戏角色类"""
def __init__(self, 名字, 生命值, 攻击力):
self.名字 = 名字
self._生命值 = 生命值
self._最大生命值 = 生命值
self._攻击力 = 攻击力
self.等级 = 1
@property
def 生命值(self):
return self._生命值
@property
def 攻击力(self):
return self._攻击力
def 攻击(self, 目标):
"""基础攻击方法"""
伤害 = self._攻击力
目标.受到伤害(伤害)
return 伤害
def 受到伤害(self, 伤害):
self._生命值 -= 伤害
if self._生命值 <= 0:
print(f"💀 {self.名字}被击败了!")
else:
print(f"❤️ {self.名字}剩余生命值:{self._生命值}")
def 是否存活(self):
return self._生命值 > 0
class 战士(游戏角色):
"""战士职业"""
def __init__(self, 名字):
super().__init__(名字, 1200, 100)
self._防御力 = 30
def 攻击(self, 目标):
print(f"⚔️ {self.名字}使用长剑猛砍!")
伤害 = self._攻击力 + 20 # 战士额外伤害
目标.受到伤害(伤害)
return 伤害
def 受到伤害(self, 伤害):
# 战士有防御力减免
实际伤害 = 伤害 - self._防御力
if 实际伤害 < 0:
实际伤害 = 1 # 最低伤害
super().受到伤害(实际伤害)
class 法师(游戏角色):
"""法师职业"""
def __init__(self, 名字):
super().__init__(名字, 800, 150)
self._魔法值 = 200
def 攻击(self, 目标):
if self._魔法值 >= 20:
self._魔法值 -= 20
print(f"🔮 {self.名字}吟唱魔法咒语!")
伤害 = self._攻击力 * 1.5 # 法师魔法伤害加成
目标.受到伤害(伤害)
print(f"剩余魔法值:{self._魔法值}")
return 伤害
else:
print("💢 魔法值不足,使用普通攻击")
return super().攻击(目标)
# 战斗演示
def 模拟战斗(英雄1, 英雄2):
print(f"\n🎯 战斗开始:{英雄1.名字} vs {英雄2.名字}")
回合数 = 1
while 英雄1.是否存活() and 英雄2.是否存活() and 回合数 <= 10:
print(f"\n--- 第{回合数}回合 ---")
# 英雄1攻击
if 英雄1.是否存活():
英雄1.攻击(英雄2)
# 英雄2攻击
if 英雄2.是否存活():
英雄2.攻击(英雄1)
回合数 += 1
# 战斗结果
if 英雄1.是否存活() and not 英雄2.是否存活():
print(f"\n🏆 {英雄1.名字}获胜!")
elif 英雄2.是否存活() and not 英雄1.是否存活():
print(f"\n🏆 {英雄2.名字}获胜!")
else:
print("\n🤝 平局!")
# 创建英雄并战斗
赵云 = 战士("赵云")
诸葛亮 = 法师("诸葛亮")
模拟战斗(赵云, 诸葛亮)
class 游戏角色:
"""基础游戏角色类"""
def __init__(self, 名字, 生命值, 攻击力):
self.名字 = 名字
self._生命值 = 生命值
self._最大生命值 = 生命值
self._攻击力 = 攻击力
self.等级 = 1
@property
def 生命值(self):
return self._生命值
@property
def 攻击力(self):
return self._攻击力
def 攻击(self, 目标):
"""基础攻击方法"""
伤害 = self._攻击力
目标.受到伤害(伤害)
return 伤害
def 受到伤害(self, 伤害):
self._生命值 -= 伤害
if self._生命值 <= 0:
print(f"💀 {self.名字}被击败了!")
else:
print(f"❤️ {self.名字}剩余生命值:{self._生命值}")
def 是否存活(self):
return self._生命值 > 0
class 战士(游戏角色):
"""战士职业"""
def __init__(self, 名字):
super().__init__(名字, 1200, 100)
self._防御力 = 30
def 攻击(self, 目标):
print(f"⚔️ {self.名字}使用长剑猛砍!")
伤害 = self._攻击力 + 20 # 战士额外伤害
目标.受到伤害(伤害)
return 伤害
def 受到伤害(self, 伤害):
# 战士有防御力减免
实际伤害 = 伤害 - self._防御力
if 实际伤害 < 0:
实际伤害 = 1 # 最低伤害
super().受到伤害(实际伤害)
class 法师(游戏角色):
"""法师职业"""
def __init__(self, 名字):
super().__init__(名字, 800, 150)
self._魔法值 = 200
def 攻击(self, 目标):
if self._魔法值 >= 20:
self._魔法值 -= 20
print(f"🔮 {self.名字}吟唱魔法咒语!")
伤害 = self._攻击力 * 1.5 # 法师魔法伤害加成
目标.受到伤害(伤害)
print(f"剩余魔法值:{self._魔法值}")
return 伤害
else:
print("💢 魔法值不足,使用普通攻击")
return super().攻击(目标)
# 战斗演示
def 模拟战斗(英雄1, 英雄2):
print(f"\n🎯 战斗开始:{英雄1.名字} vs {英雄2.名字}")
回合数 = 1
while 英雄1.是否存活() and 英雄2.是否存活() and 回合数 <= 10:
print(f"\n--- 第{回合数}回合 ---")
# 英雄1攻击
if 英雄1.是否存活():
英雄1.攻击(英雄2)
# 英雄2攻击
if 英雄2.是否存活():
英雄2.攻击(英雄1)
回合数 += 1
# 战斗结果
if 英雄1.是否存活() and not 英雄2.是否存活():
print(f"\n🏆 {英雄1.名字}获胜!")
elif 英雄2.是否存活() and not 英雄1.是否存活():
print(f"\n🏆 {英雄2.名字}获胜!")
else:
print("\n🤝 平局!")
# 创建英雄并战斗
赵云 = 战士("赵云")
诸葛亮 = 法师("诸葛亮")
模拟战斗(赵云, 诸葛亮)