[ 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)
练习:组合
[ python ] 类的组合的更多相关文章
- 7 python 类的组合
1.组合与重用性 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为 1.一个类的属性可以是一个类对象,通常情况下在一个类里面很少定义一个对象就是它 ...
- python类的组合
类的组合,即在类实例化时,将另一个类的实例作为参数传入,这样可以将两个实例关联起来. 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好. 例如,描述一个机器人类,这个大类是由很多 ...
- python类与对象的组合与继承
1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于“有一个”的场景中,继承用于“是一个”的场景 ...
- Python 类的名称空间和组合
一.Python类的名称空间 class Student(object): School = '北京大学' def __init__(self): pass stu1 = Student() stu1 ...
- python - class类 (三) 类的组合
类的组合: #组合 class A1(): def pr(self): return 'a1' class A2(): def pr(self): return 'a2' class A3(): de ...
- python 类知识点总结
python 类知识点总结 面向对象思想: 1.设计的时候,一定要明确应用场景 2.由对象分析定义类的时候,找不到共同特征和技能不用强求 1.简述类.对象.实例化.实例这些名词的含义: 类:从一组对象 ...
- python 类和对象
类和对象 类 1.类的组成 数据和函数,二者是类的属性 2.两个作用: 实例化 属性引用 属性引用:类名.属性(增删改查) 实例化: 类名加括号就是实例化,会自动出发__init__的运行 ...
- Python类和对象
目录 类与对象 其他方法 继承 经典类和新式类 派生 组合 接口.归一化设计与抽象类 继承实现的原理 子类中调用父类的方法 指名道姓 super()方法 多态与多态性 封装 单下划线开头 双下划线开头 ...
- day25类的组合多态封装
类的组合多态与封装类的组合 1. 什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 2. 为何要用组合 通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以 ...
随机推荐
- bzoj1208: [HNOI2004]宠物收养所 (sbt)
切傻逼题还能wa那么多次我也是醉了 好啦其实是sbt都不会敲了(一直用神器treap) 重点是研究了下陈大神的删除,以前treap的删除都是直接旋转去删的…… 还是treap大法好&…… 题解 ...
- [Leetcode] Construct binary tree from inorder and postorder travesal 利用中序和后续遍历构造二叉树
Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume th ...
- 《Java程序设计》第六周学习总结 20165218 2017-2018-1
20165218 2017-2018-1 <Java程序设计>第六周学习总结 教材学习内容总结 第8章 常用实用类 String类 不可以有子类 在java.lang 包中,被默认引入 S ...
- Java的各种中文乱码解决方法
一.Servlet输出乱码 1. 用servlet.getOutStream字节流输出中文,假设要输出的是String str ="钓鱼岛是中国的,无耻才是日本的". 1.1 若是 ...
- 【神仙DP】【单调队列】【模拟题】区间覆盖
传送门 Description 给出数轴上的n个线段,保留最多k条线段,问这些被保留下来的线段的并集长度为最多为多少. Input 第一行两个数n和k 接下来n行,每行两个数,表示一条线段的左右端点. ...
- ubuntu14.04安装GTX 1080 ti遇到黑屏问题
实验室给我配置了一个1080ti的卡,那个激动,windows下1000+的FPS,跑分40W,无敌,言归正传,ubuntu14.04下配nvidia 1080的驱动还是出现了很多问题,差点就要重装系 ...
- [Coding Practice] Maximum number of zeros in NxN matrix
Question: Input is a NxN matrix which contains only 0′s and 1′s. The condition is no 1 will occur in ...
- Java注释@interface的用法【转】 --好文章 很好理解
java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类. @Override,@Deprecated,@SuppressWarnings ...
- Lucene6.6添加索引数据时字符个数超限,字符数不能超过BYTE_BLOCK_SIZE=32766
最近发现Lucene6.6版本添加索引数据字符数超过32766时,出现报错,而Lucene4.6版本中则未出现这一问题,原因如下: 概述: 添加索引数据时,对于分词字段,分词后的Ter ...
- MyBatis框架的使用及源码分析(六) MapperRegistry
我们先Mapper接口的调用方式,见<MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用>的示例: public void findUserById() { Sql ...