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 = name
self.ad = ad
self.hp = hp
def attack(self, enemy): # 攻击方法,除了攻击者本身还要有敌人(enemy)对象作为参数传入
enemy.hp = enemy.hp - self.ad
print('{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 = name
self.ad = ad
self.hp = hp
def attack(self, enemy): # 攻击方法,除了攻击者本身还要有敌人(enemy)对象作为参数传入
enemy.hp = enemy.hp - self.ad
print('{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 = name
self.ad = ad
def weapen_attack(self, role, enmey): # 拿着武器攻击
enmey.hp = enmey.hp - self.ad
print('{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 = name
self.ad = ad
self.hp = hp
def attack(self, enemy): # 攻击方法,除了攻击者本身还要有敌人(enemy)对象作为参数传入
enemy.hp = enemy.hp - self.ad
print('{0}攻击了{1},{1}还剩{2}血'.format(self.name, enemy.name, enemy.hp))
def equipment_weapen(self, w): # w接受实例化的武器,这样相当于在人实例化的对象中添加了weapen这个属性这个属性对应武器的对象
self.weapen = w
class Weapen:
def __init__(self, name, ad): # 实例化武器
self.name = name
self.ad = ad
def weapen_attack(self, role, enmey): # 拿着武器攻击
enmey.hp = enmey.hp - self.ad
print('{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血
python---面对对象的组合的更多相关文章
- python:类与对象命名空间、面对对象的组合用法
1,类里可以定义两种属性: #静态属性 #静态属性就是直接在类中定义的变量 #动态属性 #动态属性就是定义在类中的方法 class Course: language = ['Chinese']#静态属 ...
- Python - 面对对象(基础)
目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...
- Python - 面对对象(进阶)
目录 Python - 面对对象(进阶) 类的成员 一. 字段 二. 方法 三. 属性 类的修饰符 类的特殊成员 Python - 面对对象(进阶) 类的成员 一. 字段 字段包括:普通字段和静态字段 ...
- Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)
目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...
- 小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系)
小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系 1. 依赖关系. 最轻的一种关系 在方法中引入另一个类的对象 class Elephant: def __init__(sel ...
- 小学生绞尽脑汁也学不会的python(面对对象-----成员)
小学生绞尽脑汁也学不会的python(面对对象-----成员) 成员 class Person: def __init__(self, name, num, gender, birthday): # ...
- 16、python面对对象之类和继承
前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名 ...
- 15、python面对对象之类和对象
前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念.类的定义.类属性.实例属性及实例方法等. 一.类和对象的概念 问题:什么是类?什么是实例对象? 类:是一类事物的抽象概念,不是真 ...
- python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法
一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...
- python面对对象编程----2:__init__
面对对象编程估计我们最早接触到的就是__init__了,也就是实例的初始化处理过程: 1:来看看最基础的__init__ class Card(object): #抽象类Card,并不用于实例化 de ...
随机推荐
- Vue2.x源码学习笔记-源码目录结构整理
先从github上下载或者clone一个vue分支项目 https://github.com/vuejs/vue 查看下目录结果 先列出一些目录 Vue |— build 打包相关的配置文件,其中最重 ...
- Removing Timezone from XMLGregorianCalendar
1.去掉時間之後的“Z”或者修改時區 package Package0809; import javax.xml.datatype.DatatypeConfigurationException; im ...
- python常用工具组件
1.JS 正则 test - 判断字符串是否符合规定的正则 rep = /\d+/; rep.test("asdfoiklfasdf89asdfasdf ...
- Spring Boot 之订制 logo
Spring Boot 之订制 logo 简介 变量 配置 编程 源码 引申和引用 Spring Boot 启动时默认会显示以下 logo: . ____ _ __ _ _ /\\ / ___'_ _ ...
- BZOJ3817 清华集训2014 Sum 类欧几里得
传送门 令\(\sqrt r = x\) 考虑将\(-1^{\lfloor d \sqrt r \rfloor}\)魔改一下 它等于\(1-2 \times (\lfloor dx \rfloor \ ...
- (转)Linux SSH配置和禁止Root远程登陆设置
原文 一.修改vi /etc/ssh/sshd_config 文件 1.修改默认端口:默认Port为22,并且已经注释掉了:修改是把注释去掉,并修改成其它的端口. 2.禁止root用户远程登陆:修改P ...
- 设计模式:装饰模式(decorate)
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 废话不多说,直接进入正题: 今天学习了装饰模式,但是代码看不太懂,于是我将装饰 ...
- ubuntu12.04安装mininet
网上安装mininet教程有很多,都是通过git命令安装,但有一个坑,安装到./install.sh时会报错,记录下来 1.通过git 下载mininet git clone git://github ...
- Ionic 3 延迟加载(Lazy Load)实战(一)
本文分享并演示了在 Ionic 3 框架中如何进行模块的延迟加载(Lazy Load)开发. 在我的实战课程「快速上手Ionic3 多平台开发企业级问答社区」中,因为开发的仿知乎 App 模块间的加载 ...
- SCRUM 12.23
距离第二轮迭结束只有几天了. 我们全体组员现在的工作方向都在应用测试上. 明天的任务分配如下 成员 已完成任务 新任务 彭林江 落实API 自动爬虫测试 王卓 提升爬虫程序性能 正确性测试 郝倩 提升 ...