类与类之间的关系:

  依赖关系

  关联关系

  聚合关系

  组合关系

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

# 依赖关系,冰箱依赖大象打开
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. python catch socket timeout

    python catch socket timeout import socket try: # do something. except socket.timeout as e: # socket ...

  2. python import package at different path

    1.导入上一级目录的package import sys sys.path.append('..') import <package> # import package at ../ 2. ...

  3. 用ADO操作数据库的方法步骤(ZT)

    http://www.cppblog.com/changshoumeng/articles/113437.html 学习ADO时总结的一些经验 用ADO操作数据库的方法步骤 ADO接口简介 ADO库包 ...

  4. 在postgresqlz中查看与删除索引

    查看索引 select * from pg_indexes where tablename='tbname';      或者     select * from pg_statio_all_inde ...

  5. unzip解压带密码的压缩包

    // 解压 String pw = "123456"; String cmd = "unzip -P " + pw + " /root/lianlia ...

  6. openwrt手工配置pptpd

    官方wiki:http://wiki.openwrt.org/doc/howto/vpn.server.pptpd#prerequisites 20190220更新:PPTP VPN协议已经被 IOS ...

  7. openwrt中防暴力破解shell的脚本

    原文:http://www.right.com.cn/forum/thread-124429-1-1.html 原理:1. snort做入侵检测是很好,但是太大太复杂,我们需要轻量化的操作.当对方进行 ...

  8. mysql 查询上个月某一天

    本文地址:http://www.cnblogs.com/jying/p/8877065.html 需求:获取上个月15号的日期 网上一搜一大堆粘贴复制的大坑:(如下是查询上个月最后一天,可是我要的不一 ...

  9. css-background-image 背景图片太大或太小

    .zoomImage {                background-image:url(images/yuantiao.jpg);                background-rep ...

  10. fiddler常用操作

    fiddler常用操作 标签(空格分隔): fiddler fidrdler抓取https请求: fiddler是一个很好的抓包工具,但是默认的是抓取HTTP的,对于pc的https的会提示网页不安全 ...