类与类之间的关系

类与类中存在以下关系:

  1. 依赖关系
  2. 关联关系
  3. 组合关系
  4. 聚合关系
  5. 实现关系
  6. 继承关系(类的三大特性之一:继承。)

1 依赖关系

⾸先, 我们设计⼀个场景. 还是最初的那个例⼦. 要把⼤象装冰箱. 注意. 在这个场景中, 其实是存在了两种事物的. ⼀个是⼤象, ⼤象负责整个事件的掌控者, 还有⼀个是冰箱, 冰箱负责被⼤象操纵.

⾸先, 写出两个类, ⼀个是⼤象类, ⼀个是冰箱类

class Elphant:def __init__(self, name):self.name = namedef open(self):'''开⻔'''passdef close(self):'''关⻔'''passclass Refrigerator:def open_door(self):print("冰箱⻔被打开了")def close_door(self):print("冰箱⻔被关上了")

  冰箱的功能非常简单, 只要会开⻔, 关⻔就⾏了. 但是⼤象就没那么简单了. 想想. ⼤象开⻔和关⻔的时候是不是要先找个冰箱啊. 然后呢? 打开冰箱⻔. 是不是打开刚才找到的那个冰箱⻔. 然后装⾃⼰. 最后呢? 关冰箱⻔, 注意, 关的是刚才那个冰箱吧. 也就是说. 开⻔和关⻔⽤的是同⼀个冰箱. 并且. ⼤象有更换冰箱的权利, 想进那个冰箱就进那个冰箱. 这时, ⼤象类和冰箱类的关系并没有那么的紧密. 因为⼤象可以指定任何⼀个冰箱.

class Elphant:def __init__(self, name):self.name = namedef open(self,obj1):'''开⻔'''print('大象要开门了,默念三声,开')obj1.open_door()def close(self):'''关⻔'''print('大象要关门了,默念三声,关')class Refrigerator:def open_door(self):print("冰箱⻔被打开了")def close_door(self):print("冰箱⻔被关上了")elphant1 = Elphant('大象')
haier = Refrigerator()
elphant1.open(haier)

  动作发起的主体是大象,你们把关门这个练一下。依赖关系:将一个类的对象或者类名传到另一个类的方法使用。此时, 我们说, ⼤象和冰箱之间就是依赖关系. 我⽤着你. 但是你不属于我. 这种关系是最弱的.比如. 公司和雇员之间. 对于正式员⼯, 肯定要签订劳动合同. 还得⼩⼼伺候着. 但是如果是兼职. 那⽆所谓. 需要了你就来. 不需要你就可以拜拜了. 这⾥的兼职(临时⼯) 就属于依赖关系.我⽤你. 但是你不属于我

2 关联,聚合,组合关系

其实这三个在代码上写法是⼀样的. 但是, 从含义上是不⼀样的.

\1. 关联关系. 两种事物必须是互相关联的. 但是在某些特殊情况下是可以更改和更换的.

\2. 聚合关系. 属于关联关系中的⼀种特例. 侧重点是xxx和xxx聚合成xxx. 各⾃有各⾃的声明周期. 比如电脑. 电脑⾥有CPU, 硬盘, 内存等等. 电脑挂了. CPU还是好的. 还是完整的个体

\3. 组合关系. 属于关联关系中的⼀种特例. 写法上差不多. 组合关系比聚合还要紧密. 比如⼈的⼤脑, ⼼脏, 各个器官. 这些器官组合成⼀个⼈. 这时. ⼈如果挂了. 其他的东⻄也跟着挂了

  先看关联关系:

这个最简单. 也是最常⽤的⼀种关系. 比如. ⼤家都有男女朋友. 男⼈关联着女朋友. 女⼈关联着男朋友. 这种关系可以是互相的, 也可以是单⽅⾯的.

class Boy:def __init__(self,name,girlFriend=None):self.name = nameself.girlFriend = girlFrienddef have_a_diner(self):if self.girlFriend:print('%s 和 %s 一起晚饭'%(self.name,self.girlFriend.name))else:print('单身狗,吃什么饭')class Girl:def __init__(self,name):self.name = name
b = Boy('日天')
b.have_a_diner() # 此时是单身狗# 突然有一天,日天牛逼了
b.girlFriend = '如花'
b.have_a_diner()  #共进晚餐
# wusir 生下来就有女朋友 服不服
gg = Girl('小花')
bb = Boy('wusir', gg)
bb.have_a_diner()# 结果嫌他有点娘,不硬,分了
bb.girlFriend = None
bb.have_a_diner()

注意. 此时Boy和Girl两个类之间就是关联关系. 两个类的对象紧密练习着. 其中⼀个没有了. 另⼀个就孤单的不得了. 关联关系, 其实就是 我需要你. 你也属于我. 这就是关联关系. 像这样的关系有很多很多. 比如. 学校和老师之间的关系.

# 老师属于学校,必须有学校才可以工作
class School:def __init__(self,name,address):self.name = nameself.address = addressclass Teacher:def __init__(self,name,school):self.name = nameself.school = schools1 = School('北京校区','美丽的沙河')
s2 = School('上海校区','上海迪士尼旁边')
s3 = School('深圳校区','南山区')t1 = Teacher('武大',s1)
t2 = Teacher('海峰',s2)
t3 = Teacher('日天',s3)print(t1.school.name)
print(t2.school.name)
print(t3.school.name)

但是学校也是依赖于老师的,所以老师学校应该互相依赖。

class School:def __init__(self,name,address):self.name = nameself.address = addressself.teacher_list = []def append_teacher(self,teacher):self.teacher_list.append(teacher)class Teacher:def __init__(self,name,school):self.name = nameself.school = schools1 = School('北京校区','美丽的沙河')
s2 = School('上海校区','上海迪士尼旁边')
s3 = School('深圳校区','南山区')t1 = Teacher('武大',s1)
t2 = Teacher('海峰',s2)
t3 = Teacher('日天',s3)s1.append_teacher(t1)
s1.append_teacher(t2)
s1.append_teacher(t3)# print(s1.teacher_list)
# for teacher in s1.teacher_list:
#     print(teacher.name)

好了. 这就是关联关系. 当我们在逻辑上出现了. 我需要你. 你还得属于我. 这种逻辑 就是关联关系. 那注意. 这种关系的紧密程度比上⾯的依赖关系要紧密的多. 为什么呢? 想想吧

至于组合关系和聚合关系,其实代码上差别不大,咱们就以组合举例:

组合:将一个类的对象封装到另一个类的对象的属性中,就叫组合。

咱们设计一个游戏人物类,让实例化几个对象让这几个游戏人物实现互殴的效果。

class Gamerole:def __init__(self,name,ad,hp):self.name = nameself.ad = adself.hp = hpdef attack(self,p1):p1.hp -= self.adprint('%s攻击%s,%s掉了%s血,还剩%s血'%(self.name,p1.name,p1.name,self.ad,p1.hp))
gailun = Gamerole('盖伦',10,200)
yasuo= Gamerole('亚索',50,80)#盖伦攻击亚索
gailun.attack(yasuo)
# 亚索攻击盖伦
yasuo.attack(盖伦)

但是这样互相攻击没有意思,一般游戏类的的对战方式要借助武器,武器是一个类,武器类包含的对象很多:刀枪棍剑斧钺钩叉等等,所以咱们要写一个武器类。

class Gamerole:    def __init__(self,name,ad,hp):        self.name = name        self.ad = ad        self.hp = hp    def attack(self,p1):        p1.hp -= self.ad        print('%s攻击%s,%s掉了%s血,还剩%s血'%(self.name,p1.name,p1.name,self.ad,p1.hp))class Weapon:    def __init__(self,name,ad):        self.name = name        self.ad = ad    def weapon_attack(self,p1,p2):        p2.hp = p2.hp - self.ad - p1.ad        print('%s 利用 %s 攻击了%s,%s还剩%s血' %(p1.name,self.name,p2.name,p2.name,p2.hp))

接下来借助武器攻击对方:

pillow = Weapon('绣花枕头',2)
pillow.weapon_attack(barry,panky)
# 但是上面这么做不好,利用武器攻击也是人类是动作的发起者,所以不能是pillow武器对象,而是人类利用武器攻击对方

所以,对代码进行修改。

class Gamerole:def __init__(self,name,ad,hp):self.name = nameself.ad = adself.hp = hpdef attack(self,p1):p1.hp -= self.adprint('%s攻击%s,%s掉了%s血,还剩%s血'%(self.name,p1.name,p1.name,self.ad,p1.hp))def equip_weapon(self,wea):self.wea = wea  # 组合:给一个对象封装一个属性改属性是另一个类的对象
class Weapon:def __init__(self,name,ad):self.name = nameself.ad = addef weapon_attack(self,p1,p2):p2.hp = p2.hp - self.ad - p1.adprint('%s 利用 %s 攻击了%s,%s还剩%s血'%(p1.name,self.name,p2.name,p2.name,p2.hp))# 实例化三个人物对象:
barry = Gamerole('太白',10,200)
panky = Gamerole('金莲',20,50)
pillow = Weapon('绣花枕头',2)# 给人物装备武器对象。
barry.equip_weapon(pillow)# 开始攻击
barry.wea.weapon_attack(barry,panky)

上面就是组合,只要是人物.equip_weapon这个方法,那么人物就封装了一个武器对象,再利用武器对象调用其类中的weapon_attack方法。

在python中类的实现关系和类的继承是一个意思,详细咱们下回讲解<_<

转载于:https://www.cnblogs.com/Jacob-yang/p/11191628.html

Python之面向对象-类与 类之间的关系相关推荐

  1. 内存(Display)、显示器(Monitor)和计算机(Computer)均属于一种产品(Product),其中计算机需要显示器和内存。请用Python语言简要实现这些类及它们之间的关系。

    内存(Display).显示器(Monitor)和计算机(Computer)均属于一种产品(Product),其中计算机需要显示器和内存.请用Python语言简要实现这些类及它们之间的关系. clas ...

  2. JAVA面向对象-----接口与类、接口之间的关系

    接口与类.接口之间的关系 大家之前都知道类与类之间的关系继承,那么接口与类之间又是怎样子的关系呢? 接口与类之间是实现关系.非抽象类实现接口时,必须把接口里面的所有方法实现.类实现接口用关键字impl ...

  3. UML类图中类之间的关系,聚合,组合,依赖总结

    下面我就根据下面这个图来讲解一下UML类图. 类图 首先,看动物那个矩形框,他就表示为一个类(Class).类图分为三层: 第一层显示类的名称 如果是抽象类,就用斜体表示 第二层显示类的特性,通常是字 ...

  4. python和pycharm之间的关系_浅析python,PyCharm,Anaconda三者之间的关系

    一.它们是什么? 1.python Python是一种跨平台的计算机程序设计语言,简单来说,python就是类似于C,Java,C++等,一种编程语言. 2.Anaconda Anaconda指的是一 ...

  5. anaconda中的python如何进行关联分析_浅析python,PyCharm,Anaconda三者之间的关系

    一.它们是什么? Python是一种跨平台的计算机程序设计语言,简单来说,python就是类似于C,Java,C++等,一种编程语言. 2.Anaconda Anaconda指的是一个开源的Pytho ...

  6. 面向对象:类与对象之间的关系

    什么是类? 类就是具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象.在面向对象的程序设计语言中,类是对一类"事物"的属性与行为的抽象. 什么是对 ...

  7. Java中基本数据类型和Object之间的关系

    1.基本数据类型和Object之间是没有关系的 2.基本数据类型的包装类 例如int 的包装类Integer的父类则是Object 输入:12 解释:在赋值的过程中进行自动装箱

  8. Java中的类与对象之间的关系

    目录 1 面向对象思想 2 类和对象 1 类 2 对象 3 类与对象的关系 3 类的定义 4 对象的使用 5 成员变量的默认值 1 面向对象思想 对象泛指现实中的一切事物,每种事物都具备自己的属性和行 ...

  9. 一文读懂Python web框架和web服务器之间的关系

    我们都知道 Python 作为一门强大的语言,能够适应快速原型和较大项目的制作,因此被广泛用于 web 应用程序的开发中. 在面试的过程中,大家或多或少都被问到过这样一个问题:一个请求从浏览器发出到数 ...

  10. Python使用---面向对象OOP(类和对象)--完善中

    来源于此 目录 1.面向对象(OOP)基本概念 1.1 过程和函数(科普) 1.2 面相过程 和 面相对象 基本概念 2 类和对象 2.1 类 2.2 对象 2.3 类和对象的关系 3 类的设计 4 ...

最新文章

  1. 日本Quoine的ICO平台正式将BCH作为融资货币
  2. 邮件服务器IMail教程(2)
  3. pdf幻灯片:圆锥曲线中的“三定”问题探究(一)
  4. Maxwell 是什么?
  5. (第八天)记忆系统训练软件3.0
  6. 《FLEX工程师成长计划》--入门篇之一:关于此书
  7. MDK各芯片厂家安装支持包下载地址(含Stm32,Nuvoton等)
  8. 乔本生涯, 为什么要这样做
  9. 【应用宝】腾讯应用宝 上线APP为什么上线了 无法在应用宝搜索到(解决方法)
  10. 测试用例-------纸杯
  11. 时间、日期的一些用法
  12. Macbook百度网盘不限速下载
  13. QQ欢乐斗地主心得体会 (三):高倍场攻略
  14. 图像类找工作面试题(二)——常见问题大总结
  15. android 美颜大眼特效
  16. Logstash 数据保护机制
  17. 如何写出网站策划方案
  18. 采购外系统——POC的重要性
  19. android手势密码源码,Android自定义UI手势密码改进版源码下载
  20. cad指北针lisp_房建工程施工图常用符号及图例(值得收藏)

热门文章

  1. HTTP 405 Method Not Allowed问题的解决
  2. #web前端技术使用总结
  3. 软件工程基础篇(五):结构化程序分析SA+结构化程序设计SP+详细设计
  4. SQL账户SA登录失败,提示错误:18456
  5. AD7705驱动代码 -- Linux SPI设备驱动
  6. [ActionSprit 3.0] FMS安装与测试
  7. C语言总谐波失真(THD)实现,从理论到应用分析改进详解
  8. 力扣题:904.水果成篮
  9. Visual Studio Code快捷指令
  10. 蛋白质ph稳定性计算机模拟,蛋白质分子设计.ppt