当前位置: 首页 > news >正文

人狗大战:面向对象关系详解

人狗大战:面向对象关系详解

好的,让我们用一个有趣的"人狗大战"例子来详细说明各种面向对象关系。

类与类之间的关系

  1. 继承/泛化 (Inheritance)
class Animal:"""动物基类"""def __init__(self, name, age):self.name = nameself.age = ageself.health = 100self.energy = 100def eat(self):self.energy = min(100, self.energy + 20)return f"{self.name}吃东西,能量恢复"def sleep(self):self.energy = min(100, self.energy + 30)self.health = min(100, self.health + 10)return f"{self.name}睡觉,恢复体力和健康"class Human(Animal):  # Human 继承 Animal"""人类 - 继承自动物"""def __init__(self, name, age, intelligence=100):super().__init__(name, age)self.intelligence = intelligenceself.weapons = []def think(self):return f"{self.name}用{self.intelligence}智商思考策略"def use_tool(self):return f"{self.name}使用工具"class Dog(Animal):  # Dog 继承 Animal"""狗类 - 继承自动物"""def __init__(self, name, age, breed, loyalty=100):super().__init__(name, age)self.breed = breedself.loyalty = loyaltyself.pack = Nonedef bark(self):return f"{self.name}汪汪叫!"def track(self):return f"{self.name}用嗅觉追踪目标"
  1. 实现 (Realization) - 使用抽象基类
from abc import ABC, abstractmethodclass Fighter(ABC):"""战斗者接口"""@abstractmethoddef attack(self, target):pass@abstractmethoddef defend(self):passclass Warrior(Human, Fighter):  # 多重继承:继承Human并实现Fighter接口"""战士类 - 继承人类并实现战斗者接口"""def __init__(self, name, age, strength=80):super().__init__(name, age)self.strength = strengthself.weapons = ["拳头"]def attack(self, target):if self.energy >= 10:self.energy -= 10damage = self.strength // 10target.health -= damagereturn f"{self.name}用拳头攻击{target.name},造成{damage}点伤害"return f"{self.name}能量不足,无法攻击"def defend(self):return f"{self.name}摆出防御姿势"class AttackDog(Dog, Fighter):  # 多重继承:继承Dog并实现Fighter接口"""攻击犬 - 继承狗类并实现战斗者接口"""def __init__(self, name, age, breed, bite_force=60):super().__init__(name, age, breed)self.bite_force = bite_forcedef attack(self, target):if self.energy >= 15:self.energy -= 15damage = self.bite_force // 8target.health -= damagereturn f"{self.name}咬{target.name},造成{damage}点伤害"return f"{self.name}太累了,无法攻击"def defend(self):return f"{self.name}低吼示威"
  1. 组合 (Composition) - 强拥有关系
class Weapon:"""武器类"""def __init__(self, name, damage, durability=100):self.name = nameself.damage = damageself.durability = durabilitydef use(self):self.durability -= 10return f"使用{self.name},耐久度剩余{self.durability}"class ArmedWarrior(Warrior):"""武装战士 - 拥有武器(组合关系)"""def __init__(self, name, age, strength=80):super().__init__(name, age, strength)# 组合关系:战士创建时就拥有基础武器self.primary_weapon = Weapon("木棍", 15)self.weapons = ["拳头", "木棍"]def attack(self, target):if self.energy >= 8:self.energy -= 8damage = self.strength // 10 + self.primary_weapon.damagetarget.health -= damageweapon_msg = self.primary_weapon.use()return f"{self.name}用{self.primary_weapon.name}攻击{target.name},造成{damage}点伤害\n{weapon_msg}"return f"{self.name}能量不足,无法攻击"
  1. 聚合 (Aggregation) - 弱拥有关系
class DogPack:"""狗群 - 与狗是聚合关系"""def __init__(self, name):self.name = nameself.members = []  # 聚合关系:狗可以独立于狗群存在def add_member(self, dog):"""添加成员狗"""self.members.append(dog)dog.pack = self  # 建立双向关联return f"{dog.name}加入了{self.name}"def remove_member(self, dog):"""移除成员狗"""if dog in self.members:self.members.remove(dog)dog.pack = Nonereturn f"{dog.name}离开了{self.name}"return f"{dog.name}不在狗群中"def group_attack(self, target):"""群体攻击"""if not self.members:return "狗群没有成员"attack_results = []for dog in self.members:if isinstance(dog, Fighter):attack_results.append(dog.attack(target))return f"{self.name}集体攻击:\n" + "\n".join(attack_results)
  1. 关联 (Association) - 结构性连接
class Battle:"""战斗类 - 关联到战斗双方"""def __init__(self, location):self.location = locationself.humans = []  # 关联到人类self.dogs = []    # 关联到狗self.round = 0def add_human(self, human):"""添加人类参与者"""self.humans.append(human)return f"{human.name}加入战斗"def add_dog(self, dog):"""添加狗参与者"""self.dogs.append(dog)return f"{dog.name}加入战斗"def start_battle(self):"""开始战斗"""self.round = 1battle_log = [f"在{self.location}开始人狗大战!"]while self.humans and self.dogs and self.round <= 10:battle_log.append(f"\n--- 第{self.round}回合 ---")# 人类攻击for human in self.humans[:]:  # 使用切片复制避免修改迭代中的列表if human.health <= 0:self.humans.remove(human)battle_log.append(f"{human.name}倒下!")continueif self.dogs:target = self.dogs[0]if isinstance(human, Fighter):battle_log.append(human.attack(target))if target.health <= 0:self.dogs.remove(target)battle_log.append(f"{target.name}倒下!")# 狗攻击for dog in self.dogs[:]:if dog.health <= 0:self.dogs.remove(dog)battle_log.append(f"{dog.name}倒下!")continueif self.humans:target = self.humans[0]if isinstance(dog, Fighter):battle_log.append(dog.attack(target))if target.health <= 0:self.humans.remove(target)battle_log.append(f"{target.name}倒下!")self.round += 1# 检查战斗是否结束if not self.humans:battle_log.append("\n狗群获胜!")breakif not self.dogs:battle_log.append("\n人类获胜!")breakif self.round > 10:battle_log.append("\n战斗超时,平局!")return "\n".join(battle_log)
  1. 依赖 (Dependency) - 临时使用关系
class Veterinarian(Human):"""兽医 - 依赖狗类进行治疗"""def __init__(self, name, age, medical_skill=80):super().__init__(name, age)self.medical_skill = medical_skilldef heal_dog(self, dog):"""治疗狗 - 临时依赖狗对象"""if dog.health >= 100:return f"{dog.name}已经很健康了"heal_amount = self.medical_skill // 10dog.health = min(100, dog.health + heal_amount)return f"{self.name}治疗{dog.name},恢复{heal_amount}点生命值"class DogTrainer(Human):"""训犬师 - 依赖狗类进行训练"""def __init__(self, name, age, training_skill=75):super().__init__(name, age)self.training_skill = training_skilldef train_dog(self, dog):"""训练狗 - 临时依赖狗对象"""improvement = self.training_skill // 15if isinstance(dog, AttackDog):dog.bite_force += improvementreturn f"{self.name}训练{dog.name},咬合力增加{improvement}"else:dog.loyalty = min(100, dog.loyalty + improvement)return f"{self.name}训练{dog.name},忠诚度增加{improvement}"

对象与对象之间的关系

运行时对象交互示例

# 创建对象并建立各种关系
def run_battle_simulation():"""运行战斗模拟"""# 创建人类战士warrior1 = ArmedWarrior("张三", 25, 85)warrior2 = Warrior("李四", 30, 90)# 创建狗attack_dog1 = AttackDog("暴风", 3, "德国牧羊犬", 70)attack_dog2 = AttackDog("雷霆", 4, "罗威纳犬", 75)normal_dog = Dog("小黄", 2, "金毛")# 创建狗群(聚合关系)wild_pack = DogPack("荒野猎手")wild_pack.add_member(attack_dog1)wild_pack.add_member(attack_dog2)# 创建兽医和训犬师(依赖关系)vet = Veterinarian("王医生", 40, 90)trainer = DogTrainer("赵教练", 35, 85)# 创建战斗(关联关系)battle = Battle("废弃工厂")battle.add_human(warrior1)battle.add_human(warrior2)battle.add_dog(attack_dog1)battle.add_dog(attack_dog2)print("=== 战斗前状态 ===")print(f"人类战士: {warrior1.name}(生命:{warrior1.health}), {warrior2.name}(生命:{warrior2.health})")print(f"攻击犬: {attack_dog1.name}(生命:{attack_dog1.health}), {attack_dog2.name}(生命:{attack_dog2.health})")print("\n=== 依赖关系演示 ===")print(trainer.train_dog(attack_dog1))  # 训犬师依赖狗进行训练print(vet.heal_dog(attack_dog2))       # 兽医依赖狗进行治疗print("\n=== 聚合关系演示 ===")print(wild_pack.group_attack(warrior1))  # 狗群集体攻击print("\n=== 战斗开始 ===")battle_result = battle.start_battle()print(battle_result)# 运行模拟
if __name__ == "__main__":run_battle_simulation()

更复杂的关系演示

class HumanDogAlliance:"""人狗联盟 - 展示更复杂的关系"""def __init__(self, name):self.name = nameself.humans = []  # 聚合关系self.dogs = []    # 聚合关系self.battles = [] # 关联关系def add_human_member(self, human):self.humans.append(human)return f"{human.name}加入联盟"def add_dog_member(self, dog):self.dogs.append(dog)return f"{dog.name}加入联盟"def create_battle_team(self, team_name, human_names, dog_names):"""创建战斗小队"""humans = [h for h in self.humans if h.name in human_names]dogs = [d for d in self.dogs if d.name in dog_names]if not humans or not dogs:return "无法创建小队,成员不存在"# 建立人和狗之间的合作关系(关联关系)for human in humans:for dog in dogs:if isinstance(human, DogTrainer):print(f"{human.name}正在训练{dog.name}...")return f"创建小队{team_name}:人类{len(humans)}名,狗{len(dogs)}只"# 使用示例
def create_alliance():"""创建人狗联盟"""alliance = HumanDogAlliance("和平守卫者")# 添加成员alliance.add_human_member(ArmedWarrior("战士小明", 28, 88))alliance.add_human_member(DogTrainer("训犬师小红", 32, 88))alliance.add_human_member(Veterinarian("兽医老李", 45, 95))alliance.add_dog_member(AttackDog("战狼", 4, "比利时马犬", 72))alliance.add_dog_member(AttackDog("铁牙", 3, "杜宾犬", 68))alliance.add_dog_member(Dog("嗅探犬", 5, "拉布拉多"))# 创建战斗小队print(alliance.create_battle_team("突击队", ["战士小明", "训犬师小红"], ["战狼", "铁牙"]))return alliance# 运行联盟创建
alliance = create_alliance()

总结

通过"人狗大战"的例子,我们可以清晰地看到:

  1. 继承:Human和Dog都继承自Animal,共享基础属性和方法
  2. 实现:Warrior和AttackDog实现Fighter接口,保证都有攻击和防御能力
  3. 组合:ArmedWarrior拥有Weapon,武器生命周期与战士一致
  4. 聚合:DogPack包含多个Dog,但狗可以独立存在
  5. 关联:Battle关联到参战的Human和Dog对象
  6. 依赖:Veterinarian和DogTrainer临时使用Dog对象进行治疗和训练

这些关系在运行时通过对象间的交互体现出来,构成了一个完整的人狗大战系统。

http://www.hskmm.com/?act=detail&tid=34922

相关文章:

  • 2025年10月中国数据库排行榜:PolarDB重回榜眼,TDSQL跃进前五
  • 闲言碎语
  • 2025年安恒信息深度解析:AI与数据安全双轮驱动的技术演进与风险透视。
  • 从代码到碳表:MyEMS 开源社区版如何支撑中小企业双碳合规?
  • 2025国内开发者首选:Gitee如何成为本土化代码托管标杆
  • 2025年10月超声波清洗机厂家推荐榜:十强对比评测与选购指南
  • 2025年10月超声波清洗机厂家推荐榜:十强对比评测与选购全攻略
  • 2025 年电气自动化培训学校推荐 —— 湖北中南高职:专注智能制造人才培养,实力护航职业发展
  • 缓存预热
  • 2025年10月超声波清洗机厂家推荐:十强对比评测榜分析
  • 2025 年防雷检测机构最新推荐排行榜单:覆盖多领域需求,深度解析优质机构优势助您避雷无忧
  • 2025年10月不锈钢水箱厂家推荐:对比评测榜助力采购高效决策
  • 2025年10月美白精华产品推荐:十强对比评测榜助你精准选品
  • 2025年10月美白精华产品推荐:对比评测榜揭示28天水光透白真实力
  • C++模板
  • 2025年10月留香沐浴露推荐:五强对比评测榜助你锁定24小时体香
  • 2025年10月不锈钢水箱厂家推荐:对比评测排行榜单与选型避坑全指南
  • 2025年GEO品牌权威推荐排行榜:技术实力与服务质量全面解析
  • 2025年GEO品牌推荐榜与排行榜权威解析
  • 2025年GEO品牌推荐排行榜Top 5:行业权威解析与选择指南
  • 2025年GEO品牌推荐排行榜前十强解析
  • 2025年安恒信息深度解析:AI与数据安全双轮驱动的技术演进与风险透视
  • MySQL 相关语法讲解
  • HTTPS的安全性详解
  • 2025年10月护眼台灯品牌测评推荐:对比排行与性能评测榜单
  • CF2120E Lanes of Cars
  • 2025中国DevOps平台选型全景报告:安全合规与生态融合成关键决策因素
  • 2025年10月高端奢侈家电品牌推荐排行榜:五大品牌综合对比与选购指南分析
  • P9745 「KDOI-06-S」树上异或
  • P9523 [JOISC 2022] 复制粘贴 3