面向对象初识(组合)
一、面向对象(组合):
定义:给一个类的对象封装一个属性,这个属性是另一个类的对象。
意义:让类的对象与另一个类的对象产生关系,类与类之间产生关系。
说白了也就是把A对象当成属性传入B对象,然后让B对象1去调用A对象
人物使用武器攻击另一个人物:
class Game_role: def __init__(self,name,ad,hp): self.name = name self.ad = ad self.hp = hp def attack(self,role): role.hp = role.hp - self.ad print('%s赤手空拳攻击了%s,%s掉了%s血,%s还剩%s血' % \ (self.name,role.name,role.name,self.ad,role.name,role.hp)) class Weapon: def __init__(self,name,ad): self.name = name self.ad = ad def attack(self,role1,role2): role2.hp = role2.hp - self.ad - role1.ad print('%s用%s攻击了%s,%s掉了%s血,%s还剩%s血' % \ (role1.name,self.name,role2.name,role2.name,role1.ad + self.ad,role2.name,role2.hp)) p1 = Game_role('盖伦',20,500) p2 = Game_role('剑豪',100,200) w1 = Weapon('大宝剑',30) w2 = Weapon('武士刀',80) p1.attack(p2) # 盖伦调用攻击方法攻击剑豪 p2.attack(p1) # 剑豪调用攻击方法攻击盖伦 w1.attack(p1,p2) # 大宝剑调用攻击方法攻击剑豪 这样不好,动作的发起者应该是人而不是武器 w2.attack(p2,p1) # 武士刀调用攻击方法攻击剑豪 这样不好,动作的发起者应该是人而不是武器
但是动作的发起者变成了武器,而不是人物,这样就很不合理啦!
所以,组合就孕育而生。
组合的好处:就是能够把一个类的对象与另一个类的对象产生关系,让一个类与另一个类产生关系
class Gamerole: def __init__(self,name,ad,hp): self.name = name self.ad = ad self.hp = hp def attack(self,role): role.hp = role.hp - self.ad print('%s赤手空拳攻击了%s,%s掉了%s血,%s还剩%s血' % \ (self.name,role.name,role.name,self.ad,role.name,role.hp)) def weapon(self,w): # 给人物封装了一个武器属性,这个属性值是Weapon类的一个对象 self.weapon1 = w # 组合 class Weapon: def __init__(self,name,ad): self.name = name self.ad = ad def attack(self,role1,role2): role2.hp = role2.hp - role1.ad - self.ad print('%s用%s攻击了%s,%s掉了%s血,%s还剩%s血' % \ (role1.name,self.name,role2.name,role2.name,(role1.ad + self.ad),role2.name,role2.hp)) p1 = Gamerole('盖伦',20,500) p2 = Gamerole('剑豪',100,200) w1 = Weapon('大宝剑',30) w2 = Weapon('武士刀',80) p1.weapon(w1) # 给盖伦封装大宝剑 print(p1.weapon1) # 其实 他就是w1 p2.weapon(w2) # 给剑豪封装武士刀 print(p2.weapon1) # 其实 他就是w2 p1.weapon1.attack(p1,p2) # 盖伦调用大宝剑攻击剑豪 p2.weapon1.attack(p2,p1) # 剑豪调用大宝剑攻击盖伦
zsir 日常分享