一、面向对象(组合):

    定义:给一个类的对象封装一个属性,这个属性是另一个类的对象。

    意义:让类的对象与另一个类的对象产生关系,类与类之间产生关系。

  人物使用武器攻击另一个人物:

class Game_role:
def __init__(self,name,ad,hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,role):
role.hp = role.hp - self.ad
print('%s赤手空拳攻击了%s,%s掉了%s血,%s还剩%s血' % \
(self.name,role.name,role.name,self.ad,role.name,role.hp))
class Weapon:
def __init__(self,name,ad):
self.name = name
self.ad = ad
def attack(self,role1,role2):
role2.hp = role2.hp - self.ad - role1.ad
print('%s用%s攻击了%s,%s掉了%s血,%s还剩%s血' % \
(role1.name,self.name,role2.name,role2.name,role1.ad + self.ad,role2.name,role2.hp))
p1 = Game_role('盖伦',20,500)
p2 = Game_role('剑豪',100,200)
w1 = Weapon('大宝剑',30)
w2 = Weapon('武士刀',80)
p1.attack(p2) # 盖伦调用攻击方法攻击剑豪
p2.attack(p1) # 剑豪调用攻击方法攻击盖伦
w1.attack(p1,p2) # 大宝剑调用攻击方法攻击剑豪 这样不好,动作的发起者应该是人而不是武器
w2.attack(p2,p1) # 武士刀调用攻击方法攻击剑豪 这样不好,动作的发起者应该是人而不是武器

  但是动作的发起者变成了武器,而不是人物,这样就很不合理啦!

    所以,组合就孕育而生。

  组合的好处:就是能够把一个类的对象与另一个类的对象产生关系,让一个类与另一个类产生关系

class Gamerole:
def __init__(self,name,ad,hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,role):
role.hp = role.hp - self.ad
print('%s赤手空拳攻击了%s,%s掉了%s血,%s还剩%s血' % \
(self.name,role.name,role.name,self.ad,role.name,role.hp))
def weapon(self,w): # 给人物封装了一个武器属性,这个属性值是Weapon类的一个对象
self.weapon1 = w # 组合
class Weapon:
def __init__(self,name,ad):
self.name = name
self.ad = ad
def attack(self,role1,role2):
role2.hp = role2.hp - role1.ad - self.ad
print('%s用%s攻击了%s,%s掉了%s血,%s还剩%s血' % \
(role1.name,self.name,role2.name,role2.name,(role1.ad + self.ad),role2.name,role2.hp))
p1 = Gamerole('盖伦',20,500)
p2 = Gamerole('剑豪',100,200)
w1 = Weapon('大宝剑',30)
w2 = Weapon('武士刀',80)
p1.weapon(w1) # 给盖伦封装大宝剑
print(p1.weapon1) # 其实 他就是w1
p2.weapon(w2) # 给剑豪封装武士刀
print(p2.weapon1) # 其实 他就是w2
p1.weapon1.attack(p1,p2) # 盖伦调用大宝剑攻击剑豪
p2.weapon1.attack(p2,p1) # 剑豪调用大宝剑攻击盖伦

《Python》 面向对象初识(组合)的更多相关文章

  1. Python()- 面向对象的组合用法

    面向对象的组合用法 一个类中以另一个类的对象作为数据属性(一个类中引用另一个类的对象)一种 "有" 的关系: 比如:定义 1个人类 & 1个武器类 然后 张三 有 枪 李四 ...

  2. Python面向对象(组合、菱形继承、多态)

    今日内容: 1.组合 2.菱形继承 3.多态与多态性 昨天内容重点回顾: 1)调用也叫实例化:发生了2件事  1.创造空对象  2.触发对象下的__init__方法,然后将p连同参数一同传给init  ...

  3. python面向对象:组合、封装、property装饰器、多态

    一.组合二.封装三.property装饰器四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. ...

  4. python 面向对象-初识

    一.分类 1.面向过程 2.面向函数 3.面向对象 二.类和对象 1.宏关 类是抽象的,对象是具体的 2.实例化 类->对象 3.类的作用 1)实例化成对象 实例化的过程,创建self对象,调用 ...

  5. 第四百一十三节,python面向对象,组合、类创建的本质、依赖注入

    组合 组合举例组合就是多个类,或者若干类联合起来完成一个任务下面举例两个类联合起来完成一个任务为了降低代码的耦合度,我们一般不会在一个类里实例化另外一个类,都是将一个类在外面实例化后传参到另外一个来这 ...

  6. Python面向对象之组合

    # 组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象. class GameRole: def __init__(self, name, ad, hp): self.name = name ...

  7. Python面向对象 | 初识

    一.面向对象编程 类 : 具有相同属性和技能的一类事物 对象: 就是对一个类的具体的描述 实例化:类——>对象的过程 使用面向对象的好处: 使得代码之间的角色关系更加明确 增强了代码的可扩展性 ...

  8. Python中面向对象初识到进阶

    面向对象初识到进阶 # 面向对象结构: # class 类名: # def __init__(self,参数1,参数2): # self.对象的属性1 = 参数1 # self.对象的属性2 = 参数 ...

  9. 初识python面向对象

    一.初识python面向对象: class Person: #使用class关键字定义一个类 age=0 #类变量(静态变量) def eat(self,food): #定义一个方法 self.age ...

随机推荐

  1. BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化

    题目链接 咳咳咳,第一次没大看题解做DP 以前的我应该是这样的 哇咔咔,这tm咋做,不管了,先看个题解,再写代码 终于看懂了,卧槽咋写啊,算了还是抄吧 第一问类似于noip的那个跳房子,随便做 这里重 ...

  2. HttpClient 的使用

    HttpClient使用: maven: <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient ...

  3. redis.conf 配置 详解 中文 2.8

        # redis version 2.8.19   # 1k => 1000 bytes# 1kb => 1024 bytes# 1m => 1000000 bytes# 1m ...

  4. 基于nodejs环境,用npm简单搭建一个本地服务器Live-server的使用

    用npm 或者cnpm进行全局安装 cnpm install -g live-server 运行后就可以直接给你虚拟一个本地服务器,而且还可以热同步 运行 live-server

  5. gulp报错插件gulp-notify 配置项

    var notify = require("gulp-notify"); module.exports = function(){ var args = Array.prototy ...

  6. K条最短路径算法(KSP, k-shortest pathes):Yen's Algorithm

    参考: K最短路径算法之Yen's Algorithm Yen's algorithm 基于网络流量的SDN最短路径转发应用 K条最短路径算法:Yen's Algorithm 算法背景 K 最短路径问 ...

  7. MVC ---- IEnumerable<T>、List<T> 前台遍历展示

    突然做前台数据展示,发现IEnumerable 对一个列表的展示还是可以,但要是多个类型放在一个表中如何处理呢,如下: 一个类IEnumerable遍历 后台 public IEnumerable&l ...

  8. MAC下安装npm和node

    Step1: 在官网下载适合mac的版本的nodejs,官网地址https://nodejs.org/en/ Step2: 上述方法我试了,但是不管用.安装完毕且重启均不能显示我安装的版本.哭 下面重 ...

  9. Struts2文件上传的大小限制问题

      问题:上传大文件报错…… 解决:修改struts.xml文件中的参数如下 <constant name="struts.multipart.maxSize" value= ...

  10. Docker 容器十诫

    [编者按]本文作者为 Rafael Benevides,主要介绍使用 Docker 容器时应该注意的十个陷阱. Docker 容器十诫 当你刚开始使用容器时,会发现容器能解决许多问题,而且好处很多: ...