一、组合
表示的一种什么有什么的关系
先来说一下,__init__的作用
| 1 2 3 4 5 6 7 8 9 10 | classDog:    def__init__(self, name, kind, hp, ad):        self.name =name  # 对象属性 属性        self.kind =kind        self.hp =hp        self.ad =ad    defbite(self, p):        p.hp -=self.ad  # 人掉血        print(‘%s咬了%s一口,%s掉了%s点血‘%(self.name, p.name, p.name, self.ad)) | 
实例化A和B
| 1 2 | A =Dog(‘笨笨‘, ‘teddy‘, 50, 10)B =Dog(‘花花‘) | 
A职员是老员工,他知道这个游戏,狗有什么属性。
B是新来的,假如没有__init__方法,B就随便传参数了,但是类方法执行时,会报错。
为了避免这个问题,在__init__方法里面,约束某些属性,必须要传,否则方法执行出错。
人狗大战游戏,现在需要增加武器
武器是人的一个属性,比如攻击力,磨损度,价格,名字,品级,技能
增加一个类
| 1 2 3 4 5 6 7 8 9 10 11 | classWeapon:    def__init__(self, name, price, level, ad):        self.name =name        self.price =price        self.level =level        self.ad =ad *self.level  # 升级之后,攻击就翻倍了        self.wear =20# 默认的耐久度,实例化时,可以不用传    defskill(self, dog):  # 技能        dog.hp -=self.ad        print(‘%s受到了%s点的伤害,%s掉了%s点血‘%(dog.name, self.name, dog.name, self.ad)) | 
实例化一个武器
| 1 | axe =Weapon(‘斧头‘, 1000, 100, 1)  # 斧头 | 
二、组合实例
1.人狗大战
武器给谁装备呢?武器需要花钱买吧,那么就需要玩家充钱,现在加一个充钱功能
完整代码如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | classPerson:    def__init__(self, name, sex, hp, ad):        self.name =name  # 对象属性 属性        self.sex =sex        self.hp =hp  # 血量        self.ad =ad  # 攻击力        self.money =0# 金额        self.arms =None# 默认武器为None<br>    defattack(self, d):        d.hp -=self.ad        print(‘%s攻击了%s,%s掉了%s点血‘%(self.name, d.name, d.name, self.ad))    defpay(self):  # 充值        money =int(input(‘请输入您要充值的金额:‘))        self.money +=money        print(‘您的余额是:%s‘%self.money)    defwear(self, weapon):  # 装备武器        ifself.money >=weapon.price:            self.arms =weapon  # 组合 给人装备了武器            self.money -=weapon.price            print(‘购买成功,您已经顺利装备了%s‘%weapon.name)        else:            print(‘余额不足,请充值!‘)    defattack_with_weapon(self, dog):  # 拿武器攻击狗        if‘arms‘inself.__dict__:  # 如果武器属性在实例属性字典里            self.arms.skill(dog)  # 使用武器攻击狗        else:            print(‘请先装备武器‘)classDog:    def__init__(self, name, kind, hp, ad):        self.name =name  # 对象属性 属性        self.kind =kind        self.hp =hp        self.ad =ad    defbite(self, p):        p.hp -=self.ad  # 人掉血        print(‘%s咬了%s一口,%s掉了%s点血‘%(self.name, p.name, p.name, self.ad))classWeapon:  # 武器    def__init__(self, name, price, level, ad):        self.name =name  # 武器名        self.price =price  # 价格        self.level =level  # 等级        self.ad =ad *self.level  # 升级之后,攻击就翻倍了        self.wear =20# 默认的耐久度,实例化时,可以不用传    defskill(self, dog):  # 技能,攻击狗        dog.hp -=self.ad  # 狗掉血        print(‘%s受到了%s点的伤害,%s掉了%s点血‘%(dog.name, self.name, dog.name, self.ad)) | 
实例化武器,玩家购买武器,攻击狗
| 1 2 3 4 5 6 7 8 | alex =Person(‘a_sb‘, ‘不详‘, 1, 5)boss_jin =Person(‘金老板‘, ‘女‘, 20, 50)teddy =Dog(‘笨笨‘, ‘teddy‘, 50, 10)axe =Weapon(‘斧头‘, 1000, 100, 1)  # 斧头alex.pay()  # 充值alex.wear(axe)  # 装备武器斧头alex.arms.skill(teddy)  # 使用斧头攻击狗 | 
执行输出:

