Python面向对象补充(组合)

什么是组合

组合:将一个类的对象封装到另一个类的对象的属性中,就叫组合
咱们设计一个游戏人物类,让实例化几个对象让这几个游戏人物实现互殴的效果。
#第一版
class Gamerole:
    def __init__(self,name,ad,hp):
        self.name = name
        self.ad = ad
        self.hp = hp
    def attack(self,p1):  #self接收盖伦的内存地址 p1接收的是我们通过gailun.attack(yasuo)传过来的yasuo的内存地址
        p1.hp -= self.ad   #p1.hp = p1.hp - self.ad
        print('%s攻击%s,%s掉了%s血,还剩%s血'%(self.name,p1.name,p1.name,self.ad,p1.hp))
gailun = Gamerole('盖伦',10,200)
yasuo= Gamerole('亚索',50,80)

#盖伦攻击亚索
gailun.attack(yasuo)
#亚索攻击盖伦
yasuo.attack(gailun)
但是这样互相攻击没有意思,一般游戏类的的对战方式要借助武器,武器是一个类,武器类包含的对象很多:刀枪棍剑斧钺钩叉等等,所以咱们要写一个武器类。
class Gamerole:
    def __init__(self,name,ad,hp):
        self.name = name
        self.ad = ad
        self.hp = hp
    def attack(self,p1):
        p1.hp -= self.ad
        print('%s攻击%s,%s掉了%s血,还剩%s血'%(self.name,p1.name,p1.name,self.ad,p1.hp))

class Weapon:
    def __init__(self,name,ad):
        self.name = name
        self.ad = ad
    def weapon_attack(self,p1,p2):
        p2.hp = p2.hp - self.ad - p1.ad
        print('%s 利用 %s 攻击了%s,%s还剩%s血' %(p1.name,self.name,p2.name,p2.name,p2.hp))
#
# 接下来借助武器攻击对方:
gailun = Gamerole('盖伦',10,200)
yasuo= Gamerole('亚索',50,80)
wea = Weapon('大保健',2)
wea.weapon_attack(yasuo,gailun)
但是上面这么做不好,利用武器攻击也是人类是动作的发起者,所以不能是pillow武器对象,而是人类利用武器攻击对方
所以,对代码进行修改。
class Gamerole:
    def __init__(self, name, ad, hp):
        self.name = name
        self.ad = ad
        self.hp = hp

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

    def equip_weapon(self, wea):
        self.wea = wea  # 组合:给一个对象封装一个属性改属性是另一个类的对象


class Weapon:
    def __init__(self, name, ad):
        self.name = name
        self.ad = ad

    def weapon_attack(self, p1, p2):
        p2.hp = p2.hp - self.ad - p1.ad
        print('%s 利用 %s 攻击了%s,%s还剩%s血'
              % (p1.name, self.name, p2.name, p2.name, p2.hp))

#
# # 实例化三个人物对象:
yasuo = Gamerole('压缩', 10, 200)
gailun = Gamerole('盖伦', 20, 50)
wea_obj = Weapon('大保健', 2)
#
# 给人物装备武器对象。
yasuo.equip_weapon(wea_obj)

# 开始攻击
yasuo.wea.weapon_attack(yasuo,gailun)
上面就是组合,只要是人物.equip_weapon这个方法,那么人物就封装了一个武器对象,再利用武器对象调用其类中的weapon_attack方法。
posted @ 2019-08-03 16:21  杨灏  阅读(67)  评论(0编辑  收藏  举报