一、类与类之间的依赖关系

⼤千世界, 万物之间皆有规则和规律. 我们的类和对象是对⼤千世界中的所有事物进⾏归类. 那事物之间存在着相对应的关系. 类与类之间也同样如此. 在⾯向对象的世界中. 类与类

中存在以下关系:

  1. 依赖关系
  2. 关联关系
  3. 组合关系
  4. 聚合关系
  5. 继承关系
  6. 实现关系

依赖关系

可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。表现在代码层面,类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用。注意,要避免双向依赖。一般来说,不应该存在双向依赖。

class Person:
def eat(self, food):
print(f'我要吃{food.name}') def read(self, book):
print(f'我在看{book.book_name}') class Food:
def __init__(self, name):
self.name = name class Book:
def __init__(self, book_name):
self.book_name = book_name apple = Food('苹果')
book = Book('红楼梦')
p = Person()
p.eat(apple) # apple对象以方法参数的形式传入到p对象中使用
p.read(book) # 可以说是Person类是依赖于Food类和Book类 # 执行结果:
# 我要吃苹果
# 我在看红楼梦

关联关系.组合关系, 聚合关系

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

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

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

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

我们来看一个例子:

class Boy:
def __init__(self, name, grilFriend):
self.name = name
self.grilFriend = grilFriend # grilFriend参数以变量的形式存储在Boy类中,这就形成了关联关系 def sendGift(self):
print(f'送给女朋友{self.grilFriend.name}一个礼物') class Girl:
def __init__(self, name):
self.name = name girl = Girl('小麻烦')
boy = Boy('马脸', girl) # 此时在Boy对象初始化时把Girl对象当作传参数出入类中
boy.sendGift() # 运行结果:
# 送给女朋友小麻烦一个礼物

上面例子就是一个关联关系,一般男女朋友都是固定的,不可能经常更换;Girl对象作为Boy的变量存在与Boy类中,如果缺失这个属性,Boy类可能无法正常工作。其实这样的关系在生活中还有很多,比如说学生和老师:

# 老师和学生的关系,一对多的关系  反过来就是一对一

class Tearcher:
def __init__(self, name, stuList=None):
self.name = name
if stuList:
self.stuList = stuList
else:
self.stuList = [] def addStudent(self, student):
self.stuList.append(student) def showStudent(self):
for stu in self.stuList:
print(stu.id, stu.name, stu.teacher) class Student:
def __init__(self, sid, name, teacher=None):
self.id = sid
self.name = name
if teacher:
self.teacher = teacher.name
else:
self.teacher = None t = Tearcher('大张伟')
s1 = Student(1, '郭德纲')
s2 = Student(2, '小沈阳', t)
s3 = Student(3, '宋小宝')
s4 = Student(4, '岳云鹏', t) t.addStudent(s1)
t.addStudent(s2)
t.addStudent(s3)
t.addStudent(s4) t.showStudent() # 运行结果:
# 1 郭德纲 None
# 2 小沈阳 大张伟
# 3 宋小宝 None
# 4 岳云鹏 大张伟

一个老师可以有多个学生,这就是一对多的关系了;如果反过来,一个学生只有一个老师,那就是一对一的关系,好了. 这就是关联关系。当我们在逻辑上出现了:我需要你,你还得属于我,这种逻辑就是关联关系,那注意这种关系的紧密程度比上⾯的依赖关系要紧密的多

  • 组合关系和聚合关系. 其实代码上的差别不⼤. 都是把另⼀个类的对象作为这个类的属性来传递和保存. 只是在含义上会有些许的不同⽽已
  • 继承关系和实现关系的内容后期再学习到继承的时候再补上

二、类中的特殊成员

什么是特殊成员呢?__init_()就是⼀个特殊的成员. 说⽩了. 带双下划线的那⼀坨. 这些⽅

法在特殊的场景的时候会被⾃动的执⾏。比如:

__init__()              # 使用 class_name() 会自动执行初始化函数__init__()
__call__() # 使用 instance() 会自动执行__call__()
__getitem__() # 执行 instance[key] 时会⾃动触发
__setitem__() # 执⾏ instance[key] = value 时会⾃动触发
__delitem__() # 执⾏del instance[key] 时会⾃动触发
__add__() # 当执行 instance1 + instance2 时会自动触发
__enter__() # 当执行with instance 时会触发,先执行__enter__函数
__exit__() # 执行完with语句退出时执行(with open ...)
__str__() # 打印一个对象时返回的时对象的__str__方法
__repr__() # 与repr差不多,返回的格式更为正式(比较偏底层,接近解释器)
__hash__ = None # 设置对象为不可hash
__hash__() # 自己定制hash计算方法
__len__() # len()调用的就是__len__
__gt__() # 大于或等于
__ge__() # 大于
__lt__() # 小于或等于
__le__() # 小于
__eq__() # 等于

python学习笔记:第17天 面向对象03 类与类之间的关系的更多相关文章

  1. python学习笔记-(十)面向对象基础

    面向对象相关知识简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

  2. python学习笔记(四)——面向对象编程

    python 支持面向过程编程和面向对象编程. 传统面向过程编程,也叫函数式编程,通过我们的需求设计成一个一个的函数来完成,对一些小规模程序来说面向过程确实简单方便不少.而随着互联网的发展,对于一些大 ...

  3. 流畅python学习笔记:第十一章:抽象基类

    __getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克 ...

  4. 流畅的python学习笔记:第十一章:抽象基类

    __getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克 ...

  5. python学习笔记-(十一)面向对象进阶&异常处理

    上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用). 静态方法 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使 ...

  6. python学习笔记(17)--eclipse和pydev的安装及汉化

    说明: 1. 本来一直用sublime的REPL跑python,不过在用爬虫下载图片输出页数的时候,由于输出太多行会卡住,而IDLE已经受够了,写起代码来实在是不好用.之前其实也写过一篇文章探讨过各种 ...

  7. python学习笔记(17)urllib.parse模块使用

    url.parse :定义了url的标准接口,实现url的各种抽取 parse模块的使用:url的解析,合并,编码,解码 使用时需导入 from urllib import parse urlpars ...

  8. Python学习笔记——基础篇【第七周】———类的静态方法 类方法及属性

    新式类和经典类的区别 python2.7 新式类——广度优先 经典类——深度优先 python3.0 新式类——广度优先 经典类——广度优先 广度优先才是正常的思维,所以python 3.0中已经修复 ...

  9. Python实用笔记 (26)面向对象高级编程——定制类

    Python的class允许定义许多定制方法,可以让我们非常方便地生成特定的类.以下是集中常见的定制方法: 怎么才能打印得好看呢?只需要定义好__str__()方法,返回一个好看的字符串就可以了: _ ...

  10. python学习笔记四 (运算符重载和命名空间、类)

    从以上代码中应该了解到: obj.attribute  查找的顺序: 从对象,类组成的树中,从下到上,从左到右到查找最近到attribute属性值,因为rec中存在name的属性,所以x.name可以 ...

随机推荐

  1. MVC的验证(模型注解和非侵入式脚本的结合使用)

    @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客户端,后台服务器的验证,MVC统统都做了包含,即使用户 ...

  2. Python+Selenium2自动化测试之IE、chrome浏览器启动

    构建Python+Selenium2自动化测试环境完成之后,就需要测试支持python的selenium的版本是否都支持在不同浏览器上运行,当前我们分别在三个最通用的浏览器上通过脚本来测试. 1.在I ...

  3. ORACLE查询删除重复记录

     比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 复制代码 代码如下: select p1.*   from persons  p1,pers ...

  4. Linux学习总结(二) 网络配置-NAT方式静态IP配置篇

    一:DHCP 服务验证 1: 之前我们在里面已经装好了centos,当时我们选择的组网方式为NAT方式,那么我们怎么样如何快速实现虚拟机系统访问外网呢?能不能直接上网呢,来我们试一下ping baid ...

  5. shiro密码的比对,密码的MD5加密,MD5盐值加密,多个Relme

    有具体问题的可以参考之前的关于shiro的博文,关于shiro的博文均是一次工程的内容 密码的比对   通过AuthenticatingRealm的CredentialsMatcher方法 密码的加密 ...

  6. js 构造函数创建钟表

    翻出来之前的一些效果,觉得这个时钟还挺好玩的就写出来共大家分享: HTML代码如下: <div id="box"> </div> 当前盒子用于插入钟表内容: ...

  7. centos7生成密钥及集群之间免密登录

    1.在本地生成密钥 命令:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 2.进入.ssh文件夹,创建保存密钥的文件 命令:touch authorized_keys ...

  8. spring+jdbc+template+transaction实现

    使用spring和jdbc模板事务实现 1.创建实体类: Role package com.wbg.sjt.entity; public class Role { private int id; pr ...

  9. VS2008 工具栏CMFCToolBar的使用总结(转)

    (一)自定义工具栏 自定义工具栏,分两种情况:一是直接添加工具栏,并自己绘制图标:二是,添加工具栏,然后与BMP关联,与VC6.0中的自定义彩色工具栏类似. 1.  自绘工具栏 1)添加Toolbar ...

  10. win8安装wampserver报403错误解决方法

    看着别人开始体验win8了,前几天我也安装了win8系统,总体来说还不错,但是今天安装完Wampserver后,浏览器输入localhost,竟然报了403错误,我以为我安装出错了,后来研究了半天,发 ...