[ python ] 类的组合

首先,使用面向对象是一个人狗大战的实例:

复制代码
class Person:
    def __init__(self, name, hp, aggr, sex):
        self.name = name
        self.hp = hp
        self.aggr = aggr
        self.sex = sex
    def hit(self, dog):
        dog.hp -= self.aggr
        print('\033[31;1m%s被打,掉了%s的血.\033[0m' %(dog.name, self.aggr))


class Dog:
    def __init__(self, name, hp, aggr, kind):
        self.name = name
        self.hp = hp
        self.aggr = aggr
        self.kind = kind
    def bite(self, person):
        person.hp -= self.aggr
        print('\033[31;1m%s被咬,掉了%s的血.\033[0m' %(person.name, self.aggr))


per = Person('kk', 100, 2, 'male')
dog = Dog('teddy', 200, 5, 'teddy')

per.hit(dog)
dog.bite(per)
复制代码

 

 

这时,为了增加游戏的趣味性,我们可以给人物添加一个武器,并且人物可以使用武器发大招:

  • 新增武器类;
  • 武器必须给人类装配上才能用;
  • 大招是武器发动的,因此大招应该是武器的一个方法
  • 人类拿着武器发起大招,应该是: 人类.武器.大招

 

接下来,就将描述转换为代码:

复制代码
class Person:
    '''人类'''

    def __init__(self, name, hp, aggr, sex):
        self.name = name
        self.hp = hp
        self.aggr = aggr
        self.sex = sex
        self.price = 0  # 设置人类初始金钱

    def hit(self, dog):
        dog.hp -= self.aggr
        print('\033[31;1m%s被打,掉了%s的血.\033[0m' % (dog.name, self.aggr))

    def get_weapon(self, weapon):
        '穿戴武器'
        if self.price > weapon.price:  # 购买武器
            self.price -= weapon.price
            self.weapon = weapon  # 带上武器


class Dog:
    '''狗类'''

    def __init__(self, name, hp, aggr, kind):
        self.name = name
        self.hp = hp
        self.aggr = aggr
        self.kind = kind

    def bite(self, person):
        person.hp -= self.aggr
        print('\033[31;1m%s被咬,掉了%s的血.\033[0m' % (person.name, self.aggr))


class Weapon:
    def __init__(self, name, aggr, njd, price):
        self.name = name
        self.aggr = aggr
        self.njd = njd
        self.price = price

    def dazhao(self, dog):
        if self.njd > 0:
            dog.hp -= self.aggr * 2
            print('\033[33;1m【%s】使用武器【%s】,发大招伤害【%s】\033[0m' % (dog.name, self.name, self.aggr * 2))


per = Person('kk', 100, 2, 'male')
dog = Dog('teddy', 200, 5, 'teddy')

per.hit(dog)
dog.bite(per)
hit_dog = Weapon('dbg', 20, 3, 998)  # 实例化一个武器对象-打狗棒
per.price += 998  # 冲钱才能变强
per.get_weapon(hit_dog)  # 人物装备上武器
per.weapon.dazhao()  # 人物使用武器发大招
复制代码

 

 

在上面的这个例子中,我们已经使用到了类的组合。

当人物需要发大招的时候,人物通过 get_weapon 方法绑定武器,self.weapon 就是武器,而大招是武器中的一个方法,因此使用:
人物.武器.大招()  这样的调用关系才能使用大招。

组合就是一个对象的属性值是另一个类的对象 

 

练习:
    使用类的组合创建讲师类,有两个类 Teacher 和 brith 类

复制代码
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey

class Teacher:
    def __init__(self, name, age, brith):
        self.name = name
        self.age = age
        self.brith = brith


class Brith:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day


brith = Brith(1998, 10, 23)

hkey = Teacher('hkey', 20, brith)

print(hkey.brith.year)
print(hkey.brith.month)
练习:组合
复制代码

 

本文作者:hukey

本文链接:https://www.cnblogs.com/hukey/p/9884679.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hukey  阅读(256)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 彩虹 Jay
彩虹 - Jay
00:00 / 00:00
An audio error has occurred.

彩虹 + 轨迹 (Live) - 周杰伦 (Jay Chou)

彩虹

词:周杰伦

曲:周杰伦

哪里有彩虹告诉我

哪里有彩虹告诉我

能不能把我的愿望还给我

能不能把我的愿望还给我

为什么天这么安静

为什么天这么安静

所有的云都跑到我这里

有没有口罩一个给我

有没有口罩一个给我

释怀说了太多就成真不了

释怀说了太多就成真不了

也许时间是一种解药

也许时间是一种解药

也是我现在正服下的毒药

也是我现在正服下的毒药

看不见你的笑 我怎么睡得着

看不见你的笑 我怎么睡得着

你的声音这么近我却抱不到

你的声音这么近我却抱不到

没有地球太阳还是会绕

没有地球太阳还是会绕

没有理由我也能自己走

没有理由我也能自己走

你要离开 我知道很简单

你要离开 我知道很简单

你说依赖 是我们的阻碍

你说依赖 是我们的阻碍

就算放开 但能不能别没收我的爱

就算放开 但能不能别没收我的爱

当作我最后才明白

当作我最后才明白

看不见你的笑 要我怎么睡得着

看不见你的笑 要我怎么睡得着

你的声音这么近我却抱不到

没有地球太阳还是会绕 会绕

没有理由我也能自己走掉

释怀说了太多就成真不了

也许时间是一种解药 解药

也是我现在正服下的毒药

轨迹

词:黄俊郎

曲:周杰伦

我会发着呆然后忘记你

接着紧紧闭上眼

想着哪一天 会有人代替

想着哪一天 会有人代替

让我不再想念你

我会发着呆 然后微微笑

我会发着呆 然后微微笑

接着紧紧闭上眼

又想了一遍 你温柔的脸

又想了一遍 你温柔的脸

在我忘记之前