组合

  给一个类的对象封装一个属性,这个属性是另一个类的对象,这样我们在调用这个属性时就指向了另一个类的对象,这样我们就可以调用另一个类的方法。

模拟英雄联盟写一个游戏人物的类
# 要求:
# (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---面对对象的组合相关推荐

  1. python遇到对象_### python面对对象小汇总 #####

    python面对对象小汇总 类的起名规则 # 所有的类名要求首字母大写,多个单词使用驼峰式命名法 如 ValueError # 类中方法: 普通方法 类方法 静态方法 魔术方法 class Phone ...

  2. Python - 面对对象(基础)

    目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...

  3. python面对对象的编程语言_python面对对象编程

    一.创建类class ClassName: '类文档字符串,用于解释说明 'class_body #类体 下面来创建一个银行客户的例子class Customer: '编写银行的顾客类' name=' ...

  4. python面对对象建立自己的电子宠物的编码_一种基于Kinect技术的电子宠物的制作方法...

    本发明涉及电子宠物技术领域,特别涉及一种基于Kinect技术的电子宠物. 背景技术: 目前人工智能发展迅速,现在的电子宠物动作单一,并且不能够与人进行交互,对周围的环境不能够准确识别,面对用户的动作只 ...

  5. Python面对对象编程——公有与私有

    一般面向对象的编程语言都会区分公有和私有的数据类型,像C++和Java它们使用public和private关键字,用于声明数据是公有的还是私有的,但是在Python中并没有用类似的关键字来修饰. (顺 ...

  6. Python面对对象编程——结合面试谈谈封装、继承、多态,相关习题详解

    1.面向对象的三大特征 封装:属性和方法放到类内部,通过对象访问属性或者方法,隐藏功能的实现细节.当然还可以设置访问权限; 继承:子类需要复用父类里面的属性或者方法,当然子类还可以提供自己的属性和方法 ...

  7. Python面对对象编程——对象、类详解及实例

    Python中类与对象的初认识 1.Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的 ...

  8. Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)

    一.构造方法 在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法. class A:def __init__(self):print('A')class B:def __init ...

  9. python面对对象编程-------5:获取属性的四种办法:@property, __setattr__(__getattr__) ,descriptor...

    一:最基本的属性操作 1 class Generic: 2 pass 3 4 g= Generic() 5 6 >>> g.attribute= "value" ...

  10. python 面对对象思维导图_Python面向对象思维导图

    P ython面向对象 面 向 对 象 入 门 33 课 程 简介 17 面 向 对 象 与 面 向 过 程 26 定 义 和 使 用 类 31 描 述 对 象 的 特 征 26 让 对 象 具 有 ...

最新文章

  1. s-stat 查看文件或者文件系统的状态信息
  2. kali安装步骤失败 选择并安装软件_Pycharm2019.3.3软件安装步骤
  3. vue路由1.0_【Vue】路由
  4. Android OpenGL ES 开发教程(24):Depth Buffer
  5. 791. 高精度加法
  6. 联想微型计算机 y720,助你全场超神 评联想拯救者Y720 Cube
  7. 手持车辆管理的神器插件,移动端车牌识别技术
  8. 人生短暂,持之以恒地做一件事情就会成功
  9. FFplay文档解读-31-视频过滤器六
  10. 【设计模式】模板模式——jdbc案例
  11. VUE+Cesium绘制迁徙图结合echarts实现
  12. 举例说明协方差矩阵的运算
  13. Top-Down Bottom-Up
  14. 5分绩点转4分_4分绩点与百分制转换方法
  15. Leopard市场占有率击败Vista
  16. Python中metrics的用法
  17. Linux网络编程——socket、bind、listen、accpet、connect、read和write
  18. 红帽linux更新资源库,如何用APT维护红帽企业版Linux
  19. [51Nod 1920] 空间统计学
  20. STM32 移植 LiteOS 过程

热门文章

  1. 记uniapp离线打包3.1.10(Hbuidlerx版本)前后区别
  2. Qt - Lambda表达式
  3. g代码生成器 源代码_生成源代码,这是一个妥协
  4. 简单的特效--css画圆圈
  5. 电磁铁的方向判定方法
  6. java jdbc视频下载_Java经典教程_JDBC视频教程 下载百度云下载
  7. 虚拟机使用桥接方式和本机同网段互动
  8. 10 万人的大场馆如何“画座位”?
  9. 开源部门文件服务器,开源文件服务器
  10. element ui 的table单元格合并