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

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)

练习:组合

[ python ] 类的组合的更多相关文章

  1. 7 python 类的组合

    1.组合与重用性 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为 1.一个类的属性可以是一个类对象,通常情况下在一个类里面很少定义一个对象就是它 ...

  2. python类的组合

    类的组合,即在类实例化时,将另一个类的实例作为参数传入,这样可以将两个实例关联起来. 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好. 例如,描述一个机器人类,这个大类是由很多 ...

  3. python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于“有一个”的场景中,继承用于“是一个”的场景 ...

  4. Python 类的名称空间和组合

    一.Python类的名称空间 class Student(object): School = '北京大学' def __init__(self): pass stu1 = Student() stu1 ...

  5. python - class类 (三) 类的组合

    类的组合: #组合 class A1(): def pr(self): return 'a1' class A2(): def pr(self): return 'a2' class A3(): de ...

  6. python 类知识点总结

    python 类知识点总结 面向对象思想: 1.设计的时候,一定要明确应用场景 2.由对象分析定义类的时候,找不到共同特征和技能不用强求 1.简述类.对象.实例化.实例这些名词的含义: 类:从一组对象 ...

  7. python 类和对象

    类和对象 类 1.类的组成    数据和函数,二者是类的属性 2.两个作用: 实例化 属性引用  属性引用:类名.属性(增删改查)   实例化: 类名加括号就是实例化,会自动出发__init__的运行 ...

  8. Python类和对象

    目录 类与对象 其他方法 继承 经典类和新式类 派生 组合 接口.归一化设计与抽象类 继承实现的原理 子类中调用父类的方法 指名道姓 super()方法 多态与多态性 封装 单下划线开头 双下划线开头 ...

  9. day25类的组合多态封装

    类的组合多态与封装类的组合 1. 什么是组合  组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 2. 为何要用组合  通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以 ...

随机推荐

  1. 【刷题】洛谷 P3809 【模板】后缀排序

    题目背景 这是一道模板题. 题目描述 读入一个长度为 \(n\) 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

  2. [luogu2783] 有机化学之神偶尔会做作弊

    题目链接 洛谷. Solution 边双缩点然后\(lca\)跑\(dis\)就好了. 注意这里是边双,不知道为啥所有题解都说的是点双. 边双是定义在点上的,即每个点只属于一个边双:点双是定义在边上的 ...

  3. 【BZOJ4031】小Z的房间(矩阵树定理)

    [BZOJ4031]小Z的房间(矩阵树定理) 题面 BZOJ 洛谷 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子 ...

  4. POJ2079:Triangle——题解

    http://poj.org/problem?id=2079 题目大意:求最大面积的三角形. —————————————————— 可以知道,最大面积的三角形的顶点一定是最大凸包的顶点. 接下来就是O ...

  5. HDU 2089 不要62 | 暴力(其实是个DP)

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 题解: 暴力水过 #include<cstdio> #include<algor ...

  6. Hydra—密码爆破神器

    公司邮箱系统密码复杂度规则:字母大小写.数字.特殊字符,四选三,长度8位以上.这种复杂度的密码看着是比较安全的,但因历史原因,邮箱系统开放了外网登陆权限,加之公司人数众多,必然会有少量员工把自己的密码 ...

  7. HDU.2734 Quicksum

    Quicksum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. bzoj2330: [SCOI2011]糖果(差分约束)

    差分约束裸题,a==b的话分别建a>=b a<=b的边就行.倒序加边不然会TLE是什么鬼 #include<iostream> #include<cstring> ...

  9. java访问Https服务的客户端示例

    关于证书 1.每个人都可以使用一些证书生成工具为自己的https站点生成证书(比如JDK的keytool),大家称它为“自签名证书”,但是自己生成的证书是不被浏览器承认的,所以浏览器会报安全提示,要求 ...

  10. VC使用sqlite

    SQLite可以到官方站点(http://www.sqlite.org/download.html)下载:Linux,Mac OS X, Windows下的已编译文件以及源代码.帮助文档. SQLit ...