[ 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('33[31;1m%s被打,掉了%s的血.33[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('33[31;1m%s被咬,掉了%s的血.33[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('33[31;1m%s被打,掉了%s的血.33[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('33[31;1m%s被咬,掉了%s的血.33[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('33[33;1m【%s】使用武器【%s】,发大招伤害【%s】33[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)
练习:组合
原文地址:https://www.cnblogs.com/hukey/p/9884679.html