Day16 python基础---面向对象初识---组合

一,面向对象之组合

  1.组合的概念:

    给一个类的对象封装一个属性,这个属性是另一个类的对象

# 模拟英雄联盟写一个游戏人物的类.
#   要求:
#   (1)创建一个 Game_role的类.
#   (2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
#   (3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
#       例: 实例化一个对象 盖伦,ad为10, hp为100
#       实例化另个一个对象 剑豪 ad为20, hp为80
#       盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血,  还剩多少血'的提示功能.


class Gamerole:
    def __init__(self,nickname,ad,hp):
        self.nickname = nickname
        self.ad = ad
        self.hp = hp

    def attack(self,role):
        role.hp = role.hp - self.ad
        print('%s攻击%s,%s掉了%s血,还剩%s血' %
              (self.nickname,role.nickname,role.nickname,self.ad,role.hp))

    def equip_weaon(self,w):  # 给人物封装了一个武器属性,这个属性值是Weapon类的一个对象
        self.weapon = w   # 组合


class Weapon:
    def __init__(self,name,ad):
        self.name = name
        self.ad = ad
    def fight(self,role1,role2):
        role2.hp = role2.hp - self.ad
        print('%s 用 %s 攻击了%s, %s掉了%s血,还剩%s血'
              %(role1.nickname,self.name,role2.nickname,role2.nickname,self.ad,role2.hp))

p1 = Gamerole('盖伦',20,500)
p2 = Gamerole('剑豪',100,200)
p1.attack(p2)
print(p2.hp)
w1.fight(p1,p2) # 这样不好,动作的发起者应该是人而不是武器
w1 = Weapon('大宝剑',30)
w2 = Weapon('武士刀',80)
print(w1)
p1.equip_weaon(w1)
print(p1.weapon)  #其实 他就是w1
p1.weapon.fight(p1,p2)
# 让剑豪利用武士刀给盖伦一刀
p2.equip_weaon(w2)
p2.weapon.fight(p2,p1)

2.组合的意义:

  让类的对象与另一个类的对象产生关系,类与类之间产生关系

原文地址:https://www.cnblogs.com/lianyeah/p/9531097.html