python---面对对象的组合
组合
给一个类的对象封装一个属性,这个属性是另一个类的对象,这样我们在调用这个属性时就指向了另一个类的对象,这样我们就可以调用另一个类的方法。
模拟英雄联盟写一个游戏人物的类
# 要求:
# (1)创建一个 Game_role的类.
# (2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
# (3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
# 例: 实例化一个对象 盖伦,ad为10, hp为100
# 实例化另个一个对象 剑豪 ad为20, hp为80
# 盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血, 还剩多少血'的提示功能.
class LolRole:def __init__(self, name, ad, hp): # 初始化对象属性self.name = nameself.ad = adself.hp = hpdef attack(self, enemy): # 攻击方法,除了攻击者本身还要有敌人(enemy)对象作为参数传入enemy.hp = enemy.hp - self.adprint('{0}攻击了{1},{1}还剩{2}血'.format(self.name, enemy.name, enemy.hp))gailun = LolRole('盖伦', 10, 100) # 实例化盖伦对象,包括名字,攻击力,血量三个属性 yasuo = LolRole('亚索', 20, 80) # 实例化亚索对象 gailun.attack(yasuo) # 盖伦攻击亚索# 运行结果:盖伦攻击了亚索,亚索还剩70血
现在我有一个weapen武器的类,需要给亚索和盖伦装备上,用武器攻击对方掉的血量则是武器的攻击力
class LolRole:def __init__(self, name, ad, hp): # 初始化对象属性self.name = nameself.ad = adself.hp = hpdef attack(self, enemy): # 攻击方法,除了攻击者本身还要有敌人(enemy)对象作为参数传入enemy.hp = enemy.hp - self.adprint('{0}攻击了{1},{1}还剩{2}血'.format(self.name, enemy.name, enemy.hp))gailun = LolRole('盖伦', 10, 100) # 实例化盖伦对象,包括名字,攻击力,血量三个属性 yasuo = LolRole('亚索', 20, 80) # 实例化亚索对象 gailun.attack(yasuo) # 盖伦攻击亚索# 运行结果:盖伦攻击了亚索,亚索还剩70血class Weapen:def __init__(self, name, ad): # 实例化武器self.name = nameself.ad = addef weapen_attack(self, role, enmey): # 拿着武器攻击enmey.hp = enmey.hp - self.adprint('{0}拿着{1}攻击了{2},{2}掉了{3}血,还剩{4}血'.format(role.name, self.name, enmey.name, self.ad, enmey.hp))sword = Weapen('大保剑', 30) # 实例化武器 katana = Weapen('草雉剑', 50)sword.weapen_attack(gailun, yasuo)
上面定了weapen类,但是你会发现我们用武器攻击人时,行动的主体是武器而不是人,人的类是调用不了武器的方法,那么我们要如何实现是人拿着武器去攻击呢,这就用到组合的概念,我们可以将weapen实例出的对象作为属性添加到我人类中,这样我人的类在调用这个属性时,就对应了weapen的对象,而武器的对象可以调用武器类的方法,这样我们就间接的让人类的对象使用了武器类的方法。
实现代码如下:
class LolRole:def __init__(self, name, ad, hp): # 初始化对象属性self.name = nameself.ad = adself.hp = hpdef attack(self, enemy): # 攻击方法,除了攻击者本身还要有敌人(enemy)对象作为参数传入enemy.hp = enemy.hp - self.adprint('{0}攻击了{1},{1}还剩{2}血'.format(self.name, enemy.name, enemy.hp))def equipment_weapen(self, w): # w接受实例化的武器,这样相当于在人实例化的对象中添加了weapen这个属性这个属性对应武器的对象self.weapen = wclass Weapen:def __init__(self, name, ad): # 实例化武器self.name = nameself.ad = addef weapen_attack(self, role, enmey): # 拿着武器攻击enmey.hp = enmey.hp - self.adprint('{0}拿着{1}攻击了{2},{2}掉了{3}血,还剩{4}血'.format(role.name, self.name, enmey.name, self.ad, enmey.hp))sword = Weapen('大保剑', 30) # 实例化武器 katana = Weapen('草雉剑', 50) gailun = LolRole('盖伦', 10, 100) # 实例化盖伦对象,包括名字,攻击力,血量三个属性 yasuo = LolRole('亚索', 20, 80) # 实例化亚索对象 print(gailun.__dict__) # {'name': '盖伦', 'ad': 10, 'hp': 100} # 将大保健交给盖伦 gailun.equipment_weapen(sword)print(gailun.__dict__) # {'name': '盖伦', 'ad': 10, 'hp': 100, 'weapen': <__main__.Weapen object at 0x05934450>} # 可以看见此时的gailun这个对象已经添加了这个weapen这个属性,这个属性就是实例化的武器的对象大宝剑 # 这样我们调用 gailun.weapen就等于sword。 gailun.weapen.weapen_attack(gailun, yasuo) # 等价于sword.weapen_attack(gailun,yasuo) # 盖伦拿着大保剑攻击了亚索,亚索掉了30血,还剩50血
转载于:https://www.cnblogs.com/Kingfan1993/p/9530912.html
python---面对对象的组合相关推荐
- python遇到对象_### python面对对象小汇总 #####
python面对对象小汇总 类的起名规则 # 所有的类名要求首字母大写,多个单词使用驼峰式命名法 如 ValueError # 类中方法: 普通方法 类方法 静态方法 魔术方法 class Phone ...
- Python - 面对对象(基础)
目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...
- python面对对象的编程语言_python面对对象编程
一.创建类class ClassName: '类文档字符串,用于解释说明 'class_body #类体 下面来创建一个银行客户的例子class Customer: '编写银行的顾客类' name=' ...
- python面对对象建立自己的电子宠物的编码_一种基于Kinect技术的电子宠物的制作方法...
本发明涉及电子宠物技术领域,特别涉及一种基于Kinect技术的电子宠物. 背景技术: 目前人工智能发展迅速,现在的电子宠物动作单一,并且不能够与人进行交互,对周围的环境不能够准确识别,面对用户的动作只 ...
- Python面对对象编程——公有与私有
一般面向对象的编程语言都会区分公有和私有的数据类型,像C++和Java它们使用public和private关键字,用于声明数据是公有的还是私有的,但是在Python中并没有用类似的关键字来修饰. (顺 ...
- Python面对对象编程——结合面试谈谈封装、继承、多态,相关习题详解
1.面向对象的三大特征 封装:属性和方法放到类内部,通过对象访问属性或者方法,隐藏功能的实现细节.当然还可以设置访问权限; 继承:子类需要复用父类里面的属性或者方法,当然子类还可以提供自己的属性和方法 ...
- Python面对对象编程——对象、类详解及实例
Python中类与对象的初认识 1.Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的 ...
- Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)
一.构造方法 在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法. class A:def __init__(self):print('A')class B:def __init ...
- python面对对象编程-------5:获取属性的四种办法:@property, __setattr__(__getattr__) ,descriptor...
一:最基本的属性操作 1 class Generic: 2 pass 3 4 g= Generic() 5 6 >>> g.attribute= "value" ...
- python 面对对象思维导图_Python面向对象思维导图
P ython面向对象 面 向 对 象 入 门 33 课 程 简介 17 面 向 对 象 与 面 向 过 程 26 定 义 和 使 用 类 31 描 述 对 象 的 特 征 26 让 对 象 具 有 ...
最新文章
- s-stat 查看文件或者文件系统的状态信息
- kali安装步骤失败 选择并安装软件_Pycharm2019.3.3软件安装步骤
- vue路由1.0_【Vue】路由
- Android OpenGL ES 开发教程(24):Depth Buffer
- 791. 高精度加法
- 联想微型计算机 y720,助你全场超神 评联想拯救者Y720 Cube
- 手持车辆管理的神器插件,移动端车牌识别技术
- 人生短暂,持之以恒地做一件事情就会成功
- FFplay文档解读-31-视频过滤器六
- 【设计模式】模板模式——jdbc案例
- VUE+Cesium绘制迁徙图结合echarts实现
- 举例说明协方差矩阵的运算
- Top-Down Bottom-Up
- 5分绩点转4分_4分绩点与百分制转换方法
- Leopard市场占有率击败Vista
- Python中metrics的用法
- Linux网络编程——socket、bind、listen、accpet、connect、read和write
- 红帽linux更新资源库,如何用APT维护红帽企业版Linux
- [51Nod 1920] 空间统计学
- STM32 移植 LiteOS 过程