前面讲了面向类与对象的继承,知道了继承是一种什么“是”什么的关系。

然而类与类之间还有另一种关系,这就是组合

先来看两个例子:
先定义两个类,一个老师类,老师类有名字,年龄,出生的年,月和日,所教的课程等特征以及走路,教书的技能。

class Teacher:def __init__(self,name,age,year,mon,day):self.name=nameself.age=ageself.year=yearself.mon=monself.day=daydef walk(self):print("%s is walking slowly"%self.name)def teach(self):print("%s is teaching"%self.name)

再定义一个学生类,学生类有名字,年龄,出生的年,月和日,学习的组名等特征以及走路,学习的技能

class Student:def __init__(self,name,age,year,mon,day):self.name=nameself.age=ageself.year=yearself.mon=monself.day=daydef walk(self):print("%s is walking slowly"%self.name)def study(self):print("%s is studying"%self.name)

根据类的继承这个特性,可以把代码缩减一下。

定义一个人类,然后再让老师类和学生类继承人类的特征和技能:

class People:def __init__(self,name,age,year,mon,day):self.name=nameself.age=ageself.year=yearself.mon=monself.day=daydef walk(self):print("%s is walking"%self.name)class Teacher(People):def __init__(self,name,age,year,mon,day,course):People.__init__(self,name,age,year,mon,day)self.course=coursedef teach(self):print("%s is teaching"%self.name)class Student(People):def __init__(self,name,age,year,mon,day,group):People.__init__(self,name,age,year,mon,day)self.group=groupdef study(self):print("%s is studying"%self.name)

再对老师和学生进行实例化,得到一个老师和一个学生。

t1=Teacher("alex",28,1989,9,2,"python")
s1=Student("jack",22,1995,2,8,"group2")

现在想知道t1和s1的名字,年龄,出生的年,月,日都很容易,但是想一次性打印出
t1或s1的生日就不那么容易了,这时就需要用字符串进行拼接了,有没有什么更好的办法呢??

那就是组合。

继承是一个子类是一个父类的关系,而组合则是一个类有另一个类的关系。

可以说每个人都有生日,而不能说人是生日,这样就要使用组合的功能 。
可以把出生的年月和日另外再定义一个日期的类,然后用老师或者是学生与这个日期的类
组合起来,就可以很容易得出老师t1或者学生s1的生日了,再也不用字符串拼接那么麻烦了。
来看下面的代码:

class Date:def __init__(self,year,mon,day):self.year=yearself.mon=monself.day=daydef birth_info(self):print("The birth is %s-%s-%s"%(self.year,self.mon,self.day))class People:def __init__(self,name,age,year,mon,day):self.name=nameself.age=ageself.birth=Date(year,mon,day)def walk(self):print("%s is walking"%self.name)class Teacher(People):def __init__(self,name,age,year,mon,day,course):People.__init__(self,name,age,year,mon,day)self.course=coursedef teach(self):print("%s is teaching"%self.name)class Student(People):def __init__(self,name,age,year,mon,day,group):People.__init__(self,name,age,year,mon,day)self.group=groupdef study(self):print("%s is studying"%self.name)
t1=Teacher("alex",28,1989,9,2,"python")
s1=Student("jack",22,1995,2,8,"group2")

这样一来,可以使用跟前面一样的方法来调用老师t1或学生s1的姓名,年龄等特征
以及走路,教书或者学习的技能。

print(t1.name)
t1.walk()
t1.teach()

输出为:

alex
alex is walking
alex is teaching

那要怎么能够知道他们的生日呢:

print(t1.birth)

输出为:

<__main__.Date object at 0x0000000002969550>

这个birth子类Teacher从父类People继承过来的,而父类People的birth又是与Date这个类组合在一
起的,所以,这个birth是一个对象。而在Date类下面有一个birth_info的技能,这样就可以通过
调用Date下面的birth_info这个函数属性来知道老师t1的生日了。

t1.birth.birth_info()

得到的结果为:

The birth is 1989-9-2

同样的,想知道实例学生s1的生日也用同样的方法:

s1.birth.birth_info()

得到的结果为:

The birth is 1995-2-8

组合就是一个类中使用到另一个类,从而把几个类拼到一起。组合的功能也是为了减少重复代码。

python面向对象编程之组合相关推荐

  1. python面向对象编程之实例属性和类属性

    廖雪峰python教程 面向对象编程之实例属性和类属性 练习 为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加: # -*- coding: utf-8 -*- ...

  2. python面向对象编程之访问限制

    廖雪峰python教程 面向对象编程之访问限制 https://www.liaoxuefeng.com/wiki/1016959663602400/1017496679217440 练习: 请把下面的 ...

  3. Python面向对象编程之Zope.interface安装使用( @implementer)implements

    一.接口简述 在我们所熟知的面向对象编程语言中,大多提供了接口(interface)的概念.接口在编程语言中指的是一个抽象类型,是抽象方法的集合:它的特点如下: 1.类通过继承接口的方式,来继承接口的 ...

  4. python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解

    本文实例讲述了Python面向对象编程之继承与多态.分享给大家供大家参考,具体如下: Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一 ...

  5. Python基础-面向对象编程之特性(property)

    Python基础-面向对象编程之特性property Python面向对象编程之特性(property) 一.统一访问原则 二.使用特性进行拦截操作 三.老式写法 Python面向对象编程之特性(pr ...

  6. python协程详解_对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...

  7. Python语言学习:python编程之pip命令集合、python调式、头部代码、代码运行等常见概念详细攻略(解决问题为导向)

    Python语言学习:python编程之pip命令集合.python调式.头部代码.代码运行等常见概念详细攻略(解决问题为导向) 目录 一.pip命令集合 1.pip常规命令 1.1  pip下载se ...

  8. 【C语言】C语言实现面向对象编程之封装

    00. 目录 文章目录 00. 目录 01. 前言 02. 简单程序示例 03. 程序示例优化 04. 总结 05. 参考 01. 前言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种 ...

  9. python编写排列组合,密码生产功能

    python编写排列组合 python在编写排列组合是会用到  itertools 模块 排列 import itertools mylist = list(itertools.permutation ...

最新文章

  1. Bootstrap 栅格系统 理解与总结
  2. 百兆以太网传输距离_新品推荐 16+2G口百兆/千兆监控接入型非标PoE交换机!
  3. SQL语句--INSERT INTO SELECT 语句用法示例
  4. java properties配置文件_java properties配置文件操作
  5. 使用EventViewer记录VSTO add-in启动错误
  6. NOIP2020洛谷P7115:移球游戏(分治)
  7. WPF vs2015,vs2012 添加ArcObjects SDK
  8. Mybatis执行流程分析_自定义简易Mybatis框架
  9. Java管理商品信息
  10. tstringlist怎么查看是否存在该数据_注意!研究生招生信息只公开1个月!应该怎么用?...
  11. SpringBoot - 工作流Activiti开发
  12. Bad Hair Day(POJ-3250)
  13. 【clickhouse】clickhouse 大表删除 Size 256G is greater than max_[table/partition]_size_to_drop 50GB
  14. python输入三个整数_python笔记3:依次输入3个数排序打
  15. c语言变量名s_i使其随i变化,动态规划I(含细c语言代码).ppt
  16. 【转】Add a user/Administrator to Windows Server 2008
  17. Oracle使用sqluldr2
  18. 5-20 打印九九口诀表 (15分)
  19. no such instruction问题
  20. WGS84经纬度坐标6度分带高斯投影正算

热门文章

  1. boost::endian模块实现udt转换的测试程序
  2. boost::contract模块实现access的测试程序
  3. Boost:是否支持sse4.1指令的测试程序
  4. Boost:bimap双图的序列化的测试程序
  5. ITK:相同类型的多个输入
  6. VTK:可视化之LabeledMesh
  7. VTK:Utilities之ArrayRange
  8. VTK:Qt之EventQtSlotConnect
  9. VTK:网格之CellEdges
  10. OpenGL parallax mapping视差映射的实例