python面向对象编程之组合
前面讲了面向类与对象的继承,知道了继承是一种什么“是”什么的关系。
然而类与类之间还有另一种关系,这就是组合
先来看两个例子:
先定义两个类,一个老师类,老师类有名字,年龄,出生的年,月和日,所教的课程等特征以及走路,教书的技能。
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面向对象编程之组合相关推荐
- python面向对象编程之实例属性和类属性
廖雪峰python教程 面向对象编程之实例属性和类属性 练习 为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加: # -*- coding: utf-8 -*- ...
- python面向对象编程之访问限制
廖雪峰python教程 面向对象编程之访问限制 https://www.liaoxuefeng.com/wiki/1016959663602400/1017496679217440 练习: 请把下面的 ...
- Python面向对象编程之Zope.interface安装使用( @implementer)implements
一.接口简述 在我们所熟知的面向对象编程语言中,大多提供了接口(interface)的概念.接口在编程语言中指的是一个抽象类型,是抽象方法的集合:它的特点如下: 1.类通过继承接口的方式,来继承接口的 ...
- python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解
本文实例讲述了Python面向对象编程之继承与多态.分享给大家供大家参考,具体如下: Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一 ...
- Python基础-面向对象编程之特性(property)
Python基础-面向对象编程之特性property Python面向对象编程之特性(property) 一.统一访问原则 二.使用特性进行拦截操作 三.老式写法 Python面向对象编程之特性(pr ...
- python协程详解_对Python协程之异步同步的区别详解
一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...
- Python语言学习:python编程之pip命令集合、python调式、头部代码、代码运行等常见概念详细攻略(解决问题为导向)
Python语言学习:python编程之pip命令集合.python调式.头部代码.代码运行等常见概念详细攻略(解决问题为导向) 目录 一.pip命令集合 1.pip常规命令 1.1 pip下载se ...
- 【C语言】C语言实现面向对象编程之封装
00. 目录 文章目录 00. 目录 01. 前言 02. 简单程序示例 03. 程序示例优化 04. 总结 05. 参考 01. 前言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种 ...
- python编写排列组合,密码生产功能
python编写排列组合 python在编写排列组合是会用到 itertools 模块 排列 import itertools mylist = list(itertools.permutation ...
最新文章
- Bootstrap 栅格系统 理解与总结
- 百兆以太网传输距离_新品推荐 16+2G口百兆/千兆监控接入型非标PoE交换机!
- SQL语句--INSERT INTO SELECT 语句用法示例
- java properties配置文件_java properties配置文件操作
- 使用EventViewer记录VSTO add-in启动错误
- NOIP2020洛谷P7115:移球游戏(分治)
- WPF vs2015,vs2012 添加ArcObjects SDK
- Mybatis执行流程分析_自定义简易Mybatis框架
- Java管理商品信息
- tstringlist怎么查看是否存在该数据_注意!研究生招生信息只公开1个月!应该怎么用?...
- SpringBoot - 工作流Activiti开发
- Bad Hair Day(POJ-3250)
- 【clickhouse】clickhouse 大表删除 Size 256G is greater than max_[table/partition]_size_to_drop 50GB
- python输入三个整数_python笔记3:依次输入3个数排序打
- c语言变量名s_i使其随i变化,动态规划I(含细c语言代码).ppt
- 【转】Add a user/Administrator to Windows Server 2008
- Oracle使用sqluldr2
- 5-20 打印九九口诀表 (15分)
- no such instruction问题
- WGS84经纬度坐标6度分带高斯投影正算