人狗大战:面向对象关系详解
好的,让我们用一个有趣的"人狗大战"例子来详细说明各种面向对象关系。
类与类之间的关系
- 继承/泛化 (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}用嗅觉追踪目标"
- 实现 (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}低吼示威"
- 组合 (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}能量不足,无法攻击"
- 聚合 (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)
- 关联 (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)
- 依赖 (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()
总结
通过"人狗大战"的例子,我们可以清晰地看到:
- 继承:Human和Dog都继承自Animal,共享基础属性和方法
- 实现:Warrior和AttackDog实现Fighter接口,保证都有攻击和防御能力
- 组合:ArmedWarrior拥有Weapon,武器生命周期与战士一致
- 聚合:DogPack包含多个Dog,但狗可以独立存在
- 关联:Battle关联到参战的Human和Dog对象
- 依赖:Veterinarian和DogTrainer临时使用Dog对象进行治疗和训练
这些关系在运行时通过对象间的交互体现出来,构成了一个完整的人狗大战系统。