类与类之间的关系:

  依赖关系

  关联关系

  聚合关系

  组合关系

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

# 依赖关系,冰箱依赖大象打开
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学习14-自动配置原理

    配置文件能配置哪些属性 配置文件能配置的属性参照 自动配置的原理 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@Ena ...

  2. es查询时报 Data too large

    报错如下: 原因: https://www.cnblogs.com/jiu0821/p/6526930.html 参数 indices.fielddata.cache.size 控制有多少堆内存是分配 ...

  3. 树莓派安装centos7

    引用:https://blog.csdn.net/elesos/article/details/80514659 1,格式化 https://www.sdcard.org/downloads/form ...

  4. 如何安装和配置RabbitMQ(转载)

    如何安装和配置RabbitMQ 今天开始一个小小的练习,学习一下安装和配置RabbitMQ,为什么要学它,因为WCF可以完全兼容和使用RabbitMQ了.我们新的大数据系统需要使用消息队列,所以就开始 ...

  5. python的垃圾回收机制【转】

    http://python.jobbole.com/82061/ http://www.jianshu.com/p/1e375fb40506 https://www.cnblogs.com/vamei ...

  6. JAVAWEB 一一 Sturts2+ibatis(框架,Sturts2,用action代替servlet)

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...

  7. fwrite()中参数含义——size和count经常用搞反

    函数原型:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);   注意:这个函数以二进制形式对文件进 ...

  8. C++ 自定义控件的移植(将在其它程序中设计的自定义控件,移植到现在的系统中)

    方法很简单就是将需要的代码 复制到 新系统中就可以了,方法就是 把相关文件添加到现有的系统中,并特别注意以下问题 \如果原设计中用到了菜单或是其它资源,相应的资源要在新的菜单中,手动添加. 目前没有发 ...

  9. Swift类型转换 和 类型别名的定义(typealias)

    (一)类型转换 类型转化在 Swift 中是比较严格的,不同类型之间可以认为是不能相互转化的,只能重新产生一个对象和值,并拷贝一份. 1.0 整型数值之间的转换. // 不同类型是不能直接相加的,这时 ...

  10. shiro 会话管理