python面向对象编程之组合
前面讲了面向类与对象的继承,知道了继承是一种什么“是”什么的关系。
然而类与类之间还有另一种关系,这就是组合
先来看两个例子:
先定义两个类,一个老师类,老师类有名字,年龄,出生的年,月和日,所教的课程等特征以及走路,教书的技能。
class Teacher:
def __init__(self,name,age,year,mon,day):
self.name=name
self.age=age
self.year=year
self.mon=mon
self.day=day
def 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=name
self.age=age
self.year=year
self.mon=mon
self.day=day
def 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=name
self.age=age
self.year=year
self.mon=mon
self.day=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=course
def 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=group
def 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=year
self.mon=mon
self.day=day
def 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=name
self.age=age
self.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=course
def 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=group
def 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 面向对象编程之进阶使用
我们在https://www.cnblogs.com/yinsedeyinse/p/9976280.html中学习了面向对象的编程方法.现在学习他的进阶用法. 1. 静态方法 2. 类方法 3. 属性 ...
- Python 面向对象编程之封装的艺术
1. 面向对象编程 OOP ( Object Oriented Programming) 即面向对象编程. 面向对象编程是一种编码思想,或是一种代码组织方式.如同编辑文章时,可以选择分段.分节的方式 ...
- python基础-面向对象编程之继承
面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...
- python基础-面向对象编程之封装、访问限制机制和property
面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...
- python基础-面向对象编程之反射
面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...
- python基础-面向对象编程之多态
面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...
- 深入理解JavaScript系列(17):面向对象编程之概论
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
- python 线程之 threading(四)
python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...
随机推荐
- SRM 20
本来T1想出给一堆数求异或最大值的,然后觉得太模板不好……就改成了现在这样(好像跟T2难度差不多了?不管辣 魔法弹 先把最大线性无关组求出来,就不会有重复的问题了.接下来单独考虑每个位,如果某个上所有 ...
- Java Socket获取本机的InetAddress实例
package com.immooc;/* * InetAddress类 */import java.net.InetAddress;import java.net.UnknownHostExcept ...
- [51nod1462]树据结构
题面: 给一颗以1为根的树. 每个点有两个权值:vi, ti,一开始全部是零. Q次操作: 读入o, u, d o = 1 对u到根上所有点的vi += d o = 2 对u到根上所有点的ti += ...
- Spring框架学习笔记(5)——自动装配
1.通过bean标签的autowire属性可以实现bean属性的自动装配. 创建一个新的Spring配置文件beans-autowire.xml,这里我们配置了3个bean,Address.Car.P ...
- java的finalize()方法与C++的析构函数
---<java编程思想> 读书笔记 --- 2017/3/15 读<java编程思想>读到初始化与清理一章,文中提及java的finalize()方法,联想到了C++的析构函 ...
- [学习OpenCV攻略][017][ARM9下移植OpenCV]
安装环境 宿主机: Red Hat Enterprise Linux Server 6.3 开发板: mini2440 相关软件: cmake-3.5.1.tar.gz.OpenCV-2.3.1a.t ...
- windows下更改mysql数据储存物理目录
windows10 1.停止mysql服务 以管理员身份运行cmd 输入命令 net stop mysql57 (我的mysql版本是5.7的,具体名称以你当前版本为主) 也可以打开任务管理器找到上面 ...
- 一对多(多对一)关系中的inverse和cascade属性
转载请标明出处 http://www.cnblogs.com/haozhengfei/p/6049276.html 首先说一下inverse: "inverse" 直译过来就是&q ...
- 十二个 ASP.NET Core 例子——IOC
目录 简单介绍 core自带IOC的实现解释 1.简单介绍 (个人理解) 是什么:IOC是一种设计原则,而非设计模式,是对流程控制,当你注入你需要的定制化类时,流程就确定了 怎么用:和IOC容器说你这 ...
- Vue精简版风格指南
前面的话 Vue官网的风格指南按照优先级(依次为必要.强烈推荐.推荐.谨慎使用)分类,且代码间隔较大,不易查询.本文按照类型分类,并对部分示例或解释进行缩减,是Vue风格指南的精简版 组件名称 [组件 ...