首先,使用面向对象是一个人狗大战的实例:
class Person:def __init__(self, name, hp, aggr, sex):self.name = nameself.hp = hpself.aggr = aggrself.sex = sexdef hit(self, dog):dog.hp -= self.aggrprint('\033[31;1m%s被打,掉了%s的血.\033[0m' %(dog.name, self.aggr))class Dog:def __init__(self, name, hp, aggr, kind):self.name = nameself.hp = hpself.aggr = aggrself.kind = kinddef bite(self, person):person.hp -= self.aggrprint('\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 = nameself.hp = hpself.aggr = aggrself.sex = sexself.price = 0 # 设置人类初始金钱def hit(self, dog):dog.hp -= self.aggrprint('\033[31;1m%s被打,掉了%s的血.\033[0m' % (dog.name, self.aggr))def get_weapon(self, weapon):'穿戴武器'if self.price > weapon.price: # 购买武器self.price -= weapon.priceself.weapon = weapon # 带上武器class Dog:'''狗类'''def __init__(self, name, hp, aggr, kind):self.name = nameself.hp = hpself.aggr = aggrself.kind = kinddef bite(self, person):person.hp -= self.aggrprint('\033[31;1m%s被咬,掉了%s的血.\033[0m' % (person.name, self.aggr))class Weapon:def __init__(self, name, aggr, njd, price):self.name = nameself.aggr = aggrself.njd = njdself.price = pricedef dazhao(self, dog):if self.njd > 0:dog.hp -= self.aggr * 2print('\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: hkeyclass Teacher:def __init__(self, name, age, brith):self.name = nameself.age = ageself.brith = brithclass Brith:def __init__(self, year, month, day):self.year = yearself.month = monthself.day = daybrith = Brith(1998, 10, 23)hkey = Teacher('hkey', 20, brith)print(hkey.brith.year)
print(hkey.brith.month)