Python面向对象编程之组合关系

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283012.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

055:vue工具 --- 人民币小写转化为大写

第055个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Python tkinter 初探Toplevel控件搭建父子窗口

目录 Toplevel控件搭建父子窗口 最简明的父子窗口框架 改进一&#xff1a;屏蔽和开放按钮 改进二&#xff1a;子窗口始终在主窗口之上 改进三&#xff1a;增加子窗口的关闭协议 改进四&#xff1a;使子窗口长获焦点 总结 Toplevel控件搭建父子窗口 最近&#xff0c;用P…

【PostgreSQL】从零开始:(十三)PostgreSQL-SQL语句操作架构(模式) Schema

Schema概述 PostgreSQL 数据库集群包含一个或多个命名数据库。角色和一些其他对象类型在整个集群中共享。与服务器的客户端连接只能访问单个数据库中的数据&#xff0c;该数据库在连接请求中指定。 用户不一定有权访问集群中的每个数据库。共享角色名称意味着不能在同一集群中…

【C++】POCO学习总结(十八):XML

【C】郭老二博文之&#xff1a;C目录 1、XML文件格式简介 1&#xff09;XML文件的开头一般都有个声明&#xff0c;声明是可选 <&#xff1f;xml version"1.0" encoding"UTF-8"?>2&#xff09;根元素&#xff1a;XML文件最外层的元素 3&#xff…

【C++】封装:练习案例-设计立方体类

练习案例&#xff1a;设计立方体类 设计立方体类(Cube) 求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等。 思路&#xff1a; 1&#xff09;创建立方体类 2&#xff09;设计属性 长&#xff0c;高&#xff0c;宽 3&#xff09;设计行为 获取立方…

在Windows上通过VS2019自带的Cmake来编译OpenCV-4.5.3源码

文章目录 用VS打开OpenCV源码cmake的配置及生成操作生成及安装 用VS打开OpenCV源码 方式一&#xff1a;文件–》打开–》Cmake 找到源码根目录下CMakeLists.txt文件 导入即可。 方式二&#xff1a;在开始使用这里 选择 打开本地文件夹 找到源码的根目录&#xff0c;导入即可…

IDEA中,如何将maven项目变为SpringBoot项目?

第一步&#xff1a;新建Maven工程 这很简单不做过多赘述。 第二步&#xff1a;修改pom.xml文件 分别加入springboot父依赖&#xff0c;web依赖&#xff0c;test测试依赖&#xff0c;maven打包依赖。 <?xml version"1.0" encoding"UTF-8"?> <…

5.5 Linux Apache服务

1、概念介绍 a. Web 服务简介 WEB服务器也称为WWW(WORLD WIDE WEB&#xff0c;万维网)服务器&#xff0c;主要功能是提供网上信息浏览服务。 常用web服务器&#xff1a;httpd&#xff08;apache&#xff09;、nginx、tomcat、IIS 客户端&#xff1a;IE、firefox、chrome b…

PyTorch官网demo解读——第一个神经网络(2)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;1&#xff09; 继上一篇文章我们展示了第一个神经网络的完整代码&#xff0c;今天我们来聊聊这个神经网络的模型设计。 这个demo实际上只使用了一个简单的线性模型&#xff1a;y wx b&#xff1b; 手写…

5.2 Linux FTP 服务

1、概念介绍 FTP&#xff08;File Transfer Protocol:文件传输协议&#xff09;作用Internet 上用来传送文件的协议 FTP Server&#xff08;File Transfer Protocol Server&#xff09;是在互联网/局域网上提供文件存储和访问服务的计算机&#xff0c;它们依照FTP协议提供服务…

【MySQL】数据库和表的操作

数据库和表的操作 一、数据库的操作1. 创建数据库2. 字符集和校验规则&#xff08;1&#xff09;查看系统默认字符集以及校验规则&#xff08;2&#xff09;查看数据库支持的字符集&#xff08;3&#xff09;查看数据库支持的字符集校验规则&#xff08;4&#xff09;校验规则对…

《点云处理》平面拟合

前言 在众多点云处理算法中&#xff0c;其中关于平面拟合的算法十分广泛。本篇内容主要是希望总结归纳各类点云平面拟合算法&#xff0c;并且将代码进行梳理保存。 环境&#xff1a; VS2019 PCL1.11.1 1.RANSAC 使用ransac对平面进行拟合是非常常见的用法&#xff0c;PCL…