类与类之间的关系:

  依赖关系

  关联关系

  聚合关系

  组合关系

依赖关系: 大象与冰箱的例子

# 依赖关系,冰箱依赖大象打开
class Elephant:
def __init__(self,name):
self.name = name def open_bx(self,obj): # obj = b1
obj.open()
print('冰箱被打开') def close_gb(self,obj):
obj.close()
print('冰箱被关闭') class Binx:
def __init__(self,name):
self.name = name def open(self):
print('1,2,3,开') def close(self):
print('1,2,3,关')
e1 = Elephant('陈臭屁')
b1 = Binx('Media')
e1.open_bx(b1) # 传b1让obj接收

大象打开冰箱

依赖关系:给一个类的方法传了一个参数此参数是另一个类的对象(类名)。
  (给大象打开冰箱的方法,传一个冰箱的对象)
这种依赖关系是所有关系中紧密型最低的,耦合性最低的。
关联关系
class Boy:
def __init__(self, name, girlfriend=None):
self.name = name
self.girlfriend = girlfriend def have_a_dinner(self):
if self.girlfriend:
print('%s 和 %s 一起共度晚餐'%(self.name,self.girlfriend.name))
else:
print('单身狗吃什么吃') def append_girl(self,girl): # 添加女朋友
self.girlfriend = girl # 关联 Girl类 def remove_girl(self): # 与女朋友分手
self.girlfriend = None class Girl:
def __init__(self, name):
self.name = name # 起初创业没有女朋友
b = Boy('alex')
# b.have_a_dinner() # 突然有一天 alex 家 拆迁,有女朋友了
g = Girl('如花')
# print(g.name)
b.append_girl(g)
b.have_a_dinner()
#
# # wusir 娃娃亲
# gg = Girl('金莲') #
# wu = Boy('武大',gg)
# wu.have_a_dinner() # # 西门太白出现。
# gg = Girl('金莲') #
# wu = Boy('武大',gg)
# # 女朋友失去了
# wu.remove_girl()
# wu.have_a_dinner()

关联关系


class School:
def __init__(self,name,address):
self.name = name
self.address = address
self.teacher_list = [] def append_teacher(self,teacher):
self.teacher_list.append(teacher) class Teacher:
def __init__(self, name,comment,school):
self.name = name
self.comment = comment
self.school = school def check_address(self):
print('%s 在%s 办公'%(self.name,self.school.address)) beijing = School('老男孩北京校区','美丽富饶的沙河')
shanghai = School('老男孩上海校区','上海漳江新区')
shenzhen = School('老男孩深圳校区','南山区平山村儿') t1 = Teacher('太白','优秀',beijing)
t2 = Teacher('景女神','优秀',beijing)
t3 = Teacher('文周','优秀',beijing)
# t2 = Teacher('海峰','优秀',shanghai)
# t3 = Teacher('日天','看吧',shenzhen)
# t1.check_address()
beijing.append_teacher(t1)
beijing.append_teacher(t2)
beijing.append_teacher(t3) # print(beijing.teacher_list)
for i in beijing.teacher_list:
print(i.name)

学校关联老师

多继承


Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先C3算法。

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找。
  • 当类是新式类时,多继承情况下,会按照C3算法去查询。

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。


class X:
pass class S(X):
pass class A(X):
pass class B(S):
pass class C(A):
pass class D(B):
pass class E(C):
pass class F(D,E,B):
pass f1 = F() print(F.mro())
#[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

多继承示例


C3算法

# 新式类:
class A:
pass class B:
pass class C(B,A):
pass
# mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
# mro(C) = mro(C(B,A)) = [C] + merge(mro(B),mro(A),[B,A]) class D:
pass class E(D):
pass
# # [E,D]
# 表头 表尾
# 表头 列表的第一个元素
# 表尾 列表中表头以外的元素集合(可以为空)
# [A,B,D,C] A表头 BDC 表尾 # merge( [E,O], [C,E,F,O], [C] ) # 取出第一个列表的表头 E 所有列表的表尾 O E F O ''
# 如果E 在所有的表尾中,那么就跳过这个列表
# merge( [E,O], [C,E,F,O], [C] )
# 第二个列表表头: C O EFO '' 将C 单独提出
# [c] + merge([E,O], [E,F,O])

上图用C3算法,求mro顺序

mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C])
mro(B) = mro(B(D,E))
mro(B(D,E)) = [B] + merge(mro(D),mro(E),[D,E])
mro(B(D,E)) = [B] + merge([D,O],[E,O],[D,E]) # D E都是单继承,所以mro(D)=[D,O] , mro(E)=[E,O]
mro(B(D,E)) = [B,D] + merge([O],[E,O],[E])
mro(B(D,E)) = [B,D,E] + merge([O],[O])
mro(B(D,E)) = [B,D,E,O] mro(C) = mro(C(E,F))
mro(C(E,F)) = [C] + merge([E,O],[F,O],[E,F])
mro(C(E,F)) = [C,E] + merge([O],[F,O],[F])
mro(C(E,F)) = [C,E,F] + merge([O],[O])
mro(C(E,F)) = [C,E,F,O] # 计算总的:
mro(A(B,C)) = [A] + merge([B,D,E,O],[C,E,F,O],[B,C])
mro(A(B,C)) = [A,B] + merge([D,E,O],[C,E,F,O],[C])
mro(A(B,C)) = [A,B,D] + merge([E,O],[C,E,F,O],[C])
mro(A(B,C)) = [A,B,D,C] + merge([E,O],[E,F,O])
mro(A(B,C)) = [A,B,D,C,E] + merge([O],[F,O])
mro(A(B,C)) = [A,B,D,C,E,F] + merge([O],[O])
mro(A(B,C)) = [A,B,D,C,E,F,O]
# super遵循mro

class O:
def func(self):
print('in O')
class D(O):
pass
# def func(self):
# print('in D') class E(O):
pass
# def func(self):
# print('in E') class F(O):
def func(self):
print('in F') class B(D,E):
pass
# def func(self):
# print('in B') class C(E,F):
pass
# def func(self):
# print('in C') class A(B,C):
def func(self):
super().func()
print('in A')
obj = A()
obj.func()
mro(A(B,C)) = [A,B,D,C,E,F,O]
print(A.__mro__)
# super 遵循mro 顺序
												

day 20 类与类之间的关系,继承2的更多相关文章

  1. PHP类和对象之间的关系

    类是对象的描述: 类和对象之间的关系类似于建房子的图纸和房子: 创建类--new对象--用对象: 一.对象的两个特性: --对象的行为(功能):可以对对象施加操作,例如,电视机的开.关.转换频道: - ...

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

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

  3. Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系

    Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...

  4. python 面向对象专题(二):类的空间问题、类与对象之间的关系、类与类之间的关系

    https://www.cnblogs.com/liubing8/p/11308127.html 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 ...

  5. UML图类,接口之间的关系

    UML图类之间的关系(来自大话设计模式中的一张图,代表了类,接口之间的各种关系)

  6. [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Java 中判断类和实例之间的关系

    判断类与实例的关系有以下三种方式 1.instanceof关键字,用来判断对象是否是类的实例 (对象 => 类 )   2.isAssignableFrom,用来判断类型间是否存在派生关系 (类 ...

  8. 关于package,import,和“找不到可以加载的主类”报错之间的关系

    正在回顾java基础 目录结构如下: 一 以下代码,进入Example所在的文件夹, javac和java都不会报错 public class Example{ public static void ...

  9. C# 多线程 类构造函数 类方法之间的关系

    先定一个类,既有构造函数又有类方法: public class WriteNumber { /// <summary> /// 构造函数 /// </summary> publ ...

  10. java 类与类之间的关系 及uml图

    类与接口之间的关系 : 继承 类与类之间的关系 :继承关系  包含关系 类与对象之间的关系 : 实例 UML 类图中类与类之间的关系: 泛化关系(generalization) 关联关系(associ ...

随机推荐

  1. 尚硅谷springboot学习10-@PropertySource,@ImportResource,@Bean

    @PropertySource 使用指定的属性文件而不一定是application.xxx 同样可以注入相关内容 @ImportResource 导入Spring的配置文件,让配置文件里面的内容生效: ...

  2. js判断对象

    一般学java的小伙伴,刚开始写js时如果遇到要判断一个字符串是否不为空,往往会这样写 if(str != undefined && str != null && st ...

  3. Zabbix邮件报警配置

    一.安装sendmail或者postfix yum install sendmail #安装 service sendmail start #启动 chkconfig sendmail on #设置开 ...

  4. 计算平面面积和斜面面积-ArcGIS案例学习笔记

    计算平面面积和斜面面积-ArcGIS案例学习笔记 联系方式:谢老师,135_4855_4328,xiexiaokui#139.com 数据:实验数据\Chp8\Ex5\demTif.tif 平面面积= ...

  5. ArcGIS案例学习笔记-聚类点的空间统计特征

    ArcGIS案例学习笔记-聚类点的空间统计特征 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:对于聚集点,根据分组字段case field,计算空间统计特征 ...

  6. C#中属性和字段的区别

    属性和字段的区别 在C#中,我们可以非常自由的.毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值.或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态 ...

  7. mysql 数据库必备命令操作,入门练习一下

    mysql 数据库必备命令操作 show databases: 查看所有的数据库: create database jfedu: 创建名为jfedu数据库: use nihao: 进入jfedu数据库 ...

  8. 四,ViewSets和Routers

    概述 在DRF中,允许在一个类中组合一组相关视图的逻辑,称为ViewSets.比如通过通用视图,可以定义列表视图.详情视图等等,但每个视图位于不同的类中,而通过ViewSets则可以将多个视图放在同一 ...

  9. pyspark 逻辑回归程序

    http://www.qqcourse.com/forum.php?mod=viewthread&tid=3688 [很重要]:http://spark.apache.org/docs/lat ...

  10. Linux 中文输入法安装

    问题一:文本不能输入中文,所以考虑到要安装搜狗输入法,在 Oracle VM VirtualBox 新建的Ubuntu系统应用中心,安装输入法总是安装失败,在自己电脑上下载了Linux的输入法文件. ...