Python基础系列讲解——继承派生和组合的概念剖析
Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是“类”和“实例”的关系,另一个是“父类”和“子类”的关系。
所谓“类”是从一堆对象中以抽象的方式把相同的特征归类得到的,“类”本身也是对象,可以更进一步抽象得到“抽象类”,“类”和“抽象类”两者的区别在于前者是从现实对象抽象而来的,后者是基于类抽象而来的,因此“抽象类”只能被继承,不能被实例化,好比我们有香蕉的类、苹果的类、桃子的类,从这些类抽取相同的特征就是水果这个“抽象类”,我们吃水果时要么是吃一个具体的香蕉,要么是吃一个具体的桃子,无法吃到一个叫做水果的东西。
那么我们抽象得到的“抽象类”之后可以继承的方式创建新类,此时原始类称为“父类”或“超类、基类(Base class、Super class)”,新类称为“子类”或“派生类”,当然抽象得到的“类”是可以创建“实例”的。总的来看,无论是继承还是实例化,它们的前提是抽象过程,只有抽象得到“类”后才能展开继承和实例化过程。
这里举个形象的例子来说明下,比如奥巴马和梅西这两个对象抽象得到的共同的特征是人,那么人作为奥巴马和梅西的一个“类”,将人、猪、狗这三个“类”抽象得到的共同的特征是动物,那么动物作为人、猪、狗的一个“父类”。反过来人、猪、狗这三个“类”继承动物这个“父类”的特征,人这个“类”实例化得到了奥巴马和梅西这两个“对象”。


对于继承和派生来说最大的好处是实现代码的重用,比如我们定义了一个类ParentClass1,接着打算新建立另外一个类SubClass1,由于两者的大部分内容相同,此时可以通过继承的方式让SubClass1继承ParentClass1,这样SubClass1则包含了ParentClass1所有的属性,包括了变量(self.name、self.age)和方法(speak),降低了重复的编程工作量,并且派生得到的SubClass1中可以添加新的属性,比如变量self.country和方法write,并不会影响到ParentClass1。(当子类新增的属性与父类重名时,以子类的为准)
class ParentClass1:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
print('speak ParentClass1')
class SubClass1(ParentClass1):
def __init__(self, name, age, country):
ParentClass1.__init__(self, name, age)
self.country = country
def write(self):
print('write SubClass1')
b1 = SubClass1('jack', 21, 'China')
print(b1.name) ——> jack
print(b1.age) ——> 21
print(b1.country) ——> China
b1.speak() ——> test ParentClass1
b1.write() ——> test SubClass1'
叉车轮胎更换
上面展示的子类继承一个父类,那么子类也可以继承多个父类。比如子类SubClass2继承了ParentClass1和ParentClass2这两个类。
class ParentClass1:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
print('speak ParentClass1')
class ParentClass2:
def walk(self):
print('walk ParentClass2')
class SubClass2(ParentClass1,ParentClass2):
def __init__(self, name, age, country):
ParentClass1.__init__(self, name, age)
self.country = country
b2 = SubClass2('jack', 21, 'China')
b2.speak() —— > speak ParentClass1
b2.walk() —— > walk ParentClass2
除了继承外,组合方式是将其他类作为属性加入到类中来扩展自身的属性资源,这样可以有效地利用其他类的资源,增强代码的重用性。组合与继承的区别主要体现在概念思想上:继承建立的“父类”和“子类”的关系是一种“是”的关系,比如程序员是人类,当“父类”和“子类”之间有很多共同的属性时使用继承比较合适;组合建立的类和组合类的关系是一种“有”的关系,比如程序员有电脑,会编程,而人类并不一定都具备,这样可以把电脑这个“类”以组合的方式添加作为属性,而不用重新再设计这个属性。
class Human:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
print('Human speak skill')
class Computer:
def __init__(self, model ,brand):
self.model=model
self.brand=brand
class Programmer(Human):
def __init__(self, name, age, country, computer):
Human.__init__(self, name, age)
self.country = country
self.computer = computer
b3=Programmer('jack', 21, 'China',Computer('X10','dell'))
print(b3.computer.model,b3.computer.brand) —— > ('X10','dell')
Python基础系列讲解——继承派生和组合的概念剖析的更多相关文章
- Python基础系列讲解——random模块随机数的生成
随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...
- Python基础系列讲解——TCP协议的socket编程
前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...
- Python基础系列讲解—动态类型语言的特点
前言 在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变.在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分 ...
- Python基础系列讲解-自动控制windows桌面
原链接:https://zhuanlan.zhihu.com/p/73001806 在使用PC时与PC交互的主要途径是看屏幕显示.听声音,点击鼠标和敲键盘等等.在自动化办公的趋势下,繁琐的工作可以让程 ...
- Python基础系列讲解——try_except异常处理机制
在Python编程中不可避免的会出现错误,在调试阶段出现语法之类的错误时,Pycharm会在Debug窗口提示错误,但是程序在运行时由于内部隐含的问题而引起错误,会导致程序终止执行.比如以下例程中,使 ...
- Python基础系列讲解——时间模块详解大全之time模块
Python中提供处理时间日期相关的内置模块有time.datetime和calendar. time模块中大多数函数调用了所在平台C library 的同名函数,因此更依赖于操作系统层面,所以tim ...
- python基础知识讲解——@classmethod和@staticmethod的作用
python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...
- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda
---恢复内容开始--- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda 从头开启python的开发环境搭建.安装比较简单, ...
- python基础系列教程——Python中的编码问题,中文乱码问题
python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...
随机推荐
- HashMap实现原理及源码分析之JDK8
继续上回HashMap的学习 HashMap实现原理及源码分析之JDK7 转载 Java8源码-HashMap 基于JDK8的HashMap源码解析 [jdk1.8]HashMap源码分析 一.H ...
- Vue2.5开发去哪儿网App 从零基础入门到实战项目
第1章 课程介绍本章主要介绍课程的知识大纲,学习前提,讲授方式及预期收获. 1-1 课程简介 试看第2章 Vue 起步本章将快速讲解部分 Vue 基础语法,通过 TodoList 功能的编写,在熟悉基 ...
- 初识Qt鼠标、键盘事件及定时器和随机数
1.新建Qt Gui应用,项目名称为“myEvent”,基类名称为QWidget,类名称为Widget. 2.widget.h文件中添加以下代码,该段代码中包含了三个事件函数和一个槽函数 privat ...
- js判断设备信息,安卓、ios、还是pc端
前端开发获取设备信息的代码if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { window.location.href =" ...
- Freemarker 基础概念
一.概述 FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写,FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用 ...
- python redis 的基本操作指令
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' redis基本命令和基本用法详解 1.redis连接 2.redis连接池 3.redis基本命令 ...
- Struts2 的ActionContext 详解
转自:http://www.cnblogs.com/shaohz2014/p/3962779.html ActionContext是Action的上下文,Struts2自动在其中保存了一些在Actio ...
- apue2e unp安装
最近在读 Richard Stevens 的大作<UNIX环境高级编程>,相信很多初读此书的人都会与我一样遇到这个问题,编译书中的程序实例时会出现问题,提示 “错误:apue.h:没有那个 ...
- 在CentOS/RHEL 6.4上安装Chromium
是的,之前Google就说了,由于CentOS/RHEL 6已经是过期的系统,所以不再会有Chrome了.虽然后来由于引起了社区的抗议,从而改口,不再提CentOS/RHEL 6是过期系统了:但是,目 ...
- OC 知识:Foundation 框架及相关类详尽总结
本文用来介绍Foundation框架的相关知识,以及Foundation框架所提供类的相关知识总结. 1. 框架介绍 框架是由很多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使开发程序变得更加 ...