一. 继承

继承指的是子类继承父类除私有内容以外的其他所有内容, 并且子类具有增加自己新内容的能力.

举例说明:

class Animal:
  print("吃是动物的本能") class Cat(Animal):
  def cat_eat(self):
    print("猫儿优雅地吃东西") c = Cat()
c.cat_eat() # 以上代码执行结果:
# 吃是动物的本能
# 猫儿优雅地吃东西

二. 接口实现(约束)

接口是一种数据类型,主要用于约束派生类中必须实现指定的方法,它存在于java和c#中.

Python中没有接口,但它有两种方式来进行约束:

1. 用普通类抛异常的方式进行约束(推荐)

举例说明:

class Animal:    # 父类Animal具有约束作用, 子类必须对父类的方法进行重写,否则抛出异常
def eat(self):
     raise NotImplementedError("eat()方法必须被重写!")
def sleep(self): pass
raise NotImplementedError("sleep()方法必须被重写!") class Dog(Animal):
def eat(self):
print("狗吃狗粮")
def sleep(self):
print("狗趴着睡") class Cat:
def eat(self):
print("猫吃猫粮")
def sleep(self):
print("猫躺着睡") dog = Dog()
dog.eat() cat = Cat()
cat.sleep()

2. 用抽象类和抽象方法进行约束(不推荐)

举例说明:

from abc import ABCMeta, abstractmethod

class Animal(metaclass=ABCMeta):  # 表示抽象类
@abstractmethod  # 加装饰器
def eat(self): pass class Dog(Animal):
def eat(self):
print("狗吃狗粮") class Cat:
def eat(self):
print("猫吃猫粮") dog = Dog()
dog.eat() cat = Cat()
cat.eat()

三. 依赖

可以简单的理解, 就是一个类 A 使用到了另一个类 B, 而这种使用关系是具有偶然性的,临时性的 非常弱的,  但是 B 类的变化会影响到 A. 比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖. 表现在代码层面为: 类 B 作为参数被类 A 在某个method 方法中使用.

举例说明:

class Person:
def __init__(self, name):
self.name = name
def call_up(self, cellphone):
print("%s正在使用%s打电话" % (self.name, cellphone.name))
cellphone.call() class Cellphone:
def __init__(self, name):
self.name = name
def call(self):
print("%s正在为您呼叫" % self.name) person = Person("王乃卉")
cellphone = Cellphone("iPhoneX") person.call_up(cellphone) # 以上代码执行结果是:
# 王乃卉正在使用iPhoneX打电话
# iPhoneX正在为您呼叫

四. 关联

关联体现的是两个类, 或者类与接口之间语义级别的一种强依赖关系.
比如我和我的朋友, 这种关系比依赖更强, 不存在依赖关系的偶然性, 关系也不是临时性的, 一般是长期性的, 而且双方的关系一般是平等的, 关联可以是单向,双向的.
表现在代码层面为: 被关联类 B 以类属性的形式出现在关联类 A 中, 也可能是关联类 A 引用了一个类型为被关联类 B 的全局变量.

1. 聚合

聚合是关联关系的一种特例, 它体现的是整体与部分,拥有的关系, 即 has-a 的关系. 此时整体与部分之间是可分离的, 他们可以具有各自的生命周期, 部分可以属于多个整体对象, 也可以为多个整体对象享. 比如计算机与 CPU, 公司与员工的关系等.
表现在代码层面, 和关联关系是一致的,只能从语义级别来区分.

2. 组合

组合也是关联关系的一种特例, 它体现的是一种 contains-a 的关系, 这种关系比聚合更强, 也称为强聚合. 它同样体现整体与部分间的关系, 但此时整体与部分是不可分的, 整体的生命周期结束也就意味着部分的生命周期结束. 比如你和你的大脑. 表现在代码层面, 和关联关系是一致的,只能从语义级别来区分.

辅助理解:

大雁喜欢热闹害怕孤独, 所以它们一直过着群居的生活, 这样就有了雁群. 每一只大雁都有自己的雁群, 每个雁群都有很多大雁, 大雁与雁群的这种关系就可以称之为聚合. 另外, 每只大雁都有两只翅膀, 大雁与雁翅的关系就叫做组合. 由此可见, 聚合的关系明显没有组合紧密, 大雁不会因为它们的首领将雁群解散而无法生存, 而雁翅就无法脱离大雁而单独生存.所以说, 聚合关系的类具有不同的生命周期, 而组合关系的类具有相同的生命周期.

----------------------------------------------------------------

参考资料:

1. python的几种实现方式

2. python中的接口

3. 面向对象中的聚合与耦合

----------------------------------------------------------------

Python 面向对象--继承,实现,依赖,关联,聚合,组合的更多相关文章

  1. UML关系(泛化,实现,依赖,关联(聚合,组合))

    http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html UML类图关系(泛化 .继承.实现.依赖.关联.聚合.组合) 继承.实现.依赖. ...

  2. UML 类关系图(泛化,实现,依赖,关联(聚合,组合))

    UML的构造快包含3种:  (1) 事物(4种):结构事物,行为事物,分组事物,注释事物 (2) 关系(4种):泛化关系,实现关系,依赖关系,关联关系 (3) 图(10种):用例图,类图,对象图,包图 ...

  3. UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...

  4. UML类图及依赖,泛化,关联,聚合,组合,实现

    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...

  5. UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现(转)

    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现   类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统 ...

  6. UML类关系:依赖,关联,聚合和组合

    UML图示例:(可使用StartUML来画图,小巧^_^) http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html 聚合:表 ...

  7. 分分钟弄明白UML中泛化 , 实现 , 关联, 聚合, 组合, 依赖

    在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Compo ...

  8. python 面向对象 继承 派生 组合

    具体参考博客:http://www.cnblogs.com/linhaifeng/articles/6182264.html#_label12 一.面向对象 面向对象:对象与对象之间的相互交互,不可预 ...

  9. UML 图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    http://www.uml.org.cn/oobject/201211231.asp 1. 关联 一个类作为另外一个类的变量:在UML类图中,用实线连接有关联关系的对象所对应的类 2.聚合 表示整体 ...

随机推荐

  1. 常量和iota

    定义常量时如果不是必须指定特定类型,可以省略类型,使用默认类型.且数值类型常量(不定义类型)可以直接进行运算 常量的值可以是表达式,但是不允许出现变量 func main() { const a st ...

  2. JS 字符串转字节截取

    /* * param str 要截取的字符串 * param L 要截取的字节长度,注意是字节不是字符,一个汉字两个字节 * return 截取后的字符串 */ function CutStr(str ...

  3. HDU - 5557 Matching Compressed String (自动机+倍增+表达式计算)

    题意是给你一个自动机和一个字符串的括号表达式,问自动机能否接受这个字符串. 我一想,这不就是个模拟栈计算表达式+倍增么? 再一想,复杂度200*1000*10000*log(1e9),不对啊! 交上去 ...

  4. 基于Ajax技术的前后端Json数据交互方式实现

    前言 使用浏览器访问网站是日常生活中必不可少的一件事情,当我们在浏览器地址栏中输入网址后会看到网站的内容,那么这个过程中发生了什么?下面简单介绍下浏览器访问网站过程. 第一步:浏览器向DNS服务器发起 ...

  5. SpringDatajpa 使用原生的SQL进行分组查询

    话不多说,直接上代码 dao nativeQuery = true ---> 执行原生的SQL语法,也就是说这段sql拷贝到数据库中,然后就运行. 我们期望的结果: 取值: 取值结果: 结合实际 ...

  6. BZOJ1101——莫比乌斯函数&&入门

    题目 链接 有$50000$次查询,对于给定的整数$a,b$和$d$,有多少正整数对$x$和$y$,满足$x \leq a$,$y \leq b$,并且$gcd(x, y)=d$.$1 \leq k ...

  7. 斑马105SLPlus串口打印二维码

    1.根据说明书调试硬件,校准介质还有色带(很重要),我自己搞了好几天才搞明白. 2.设置好参数,比如打印介质连续.非连续,热敏还是热转质 3.打印机上电后悔自动校准,校准成功后就可以直接通过串口打印, ...

  8. 查看nginx服务器状态

    编译安装时使用--with-http_stub_status_module开启状态页面模块 [root@proxy ~]# yum -y install gcc pcre-devel openssl- ...

  9. MFC 列表控件List Control

    一般用带有表头的报表模式,所以属性:View设为Report // OnInitDialog()中 CString str[] = {TEXT("姓名"),TEXT("性 ...

  10. Luogu P4198 楼房重建 分块 or 线段树

    思路:分块 提交:2次(第一次的求解有问题) 题解: 设块长为$T$,我们开$N/T$个单调栈,维护每一块的上升斜率. 修改时暴力重构整个块,$O(T)$ 求解时记录一个最大斜率$lst$,然后块内二 ...