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基础系列讲解——继承派生和组合的概念剖析的更多相关文章

  1. Python基础系列讲解——random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  2. Python基础系列讲解——TCP协议的socket编程

    前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...

  3. Python基础系列讲解—动态类型语言的特点

    前言 在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变.在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分 ...

  4. Python基础系列讲解-自动控制windows桌面

    原链接:https://zhuanlan.zhihu.com/p/73001806 在使用PC时与PC交互的主要途径是看屏幕显示.听声音,点击鼠标和敲键盘等等.在自动化办公的趋势下,繁琐的工作可以让程 ...

  5. Python基础系列讲解——try_except异常处理机制

    在Python编程中不可避免的会出现错误,在调试阶段出现语法之类的错误时,Pycharm会在Debug窗口提示错误,但是程序在运行时由于内部隐含的问题而引起错误,会导致程序终止执行.比如以下例程中,使 ...

  6. Python基础系列讲解——时间模块详解大全之time模块

    Python中提供处理时间日期相关的内置模块有time.datetime和calendar. time模块中大多数函数调用了所在平台C library 的同名函数,因此更依赖于操作系统层面,所以tim ...

  7. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  8. python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda

    ---恢复内容开始--- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda 从头开启python的开发环境搭建.安装比较简单, ...

  9. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

随机推荐

  1. github与git基本操作(一)

    一.git上传本地项目到github 前提:github创建一个空仓库(得到“https://自己的仓库url地址”)1.第一步:就是要进入这个目录下,cmd2.第二步:输入git init3.第三步 ...

  2. 根据经纬度获取位置描述:百度API与高德API的区别

    百度API 使用百度坐标 1.访问方式一 http://api.map.baidu.com/geocoder/v2/?location=35.063592,118.38513&output=j ...

  3. 矩阵求逆·学习笔记 $\times$ [$LuoguP4783$]矩阵求逆

    哦?今天在\(luogu\)上fa♂现了矩阵求逆的板子--于是就切了切. 那么我们考虑一个矩阵\(A\),它的逆矩阵记作\(A^{-1}\),其中对于矩阵这个群来讲,会有\(A \cdot A^{-1 ...

  4. Python学习笔记系列——函数

    今年下半年的计划主要是Python和Mysql了,公司不方便看书和视频,就照着廖雪峰的Python网站开始看了.以下纯为个人笔记记录,若是想系统学习的小伙伴还是看这里的好一些,毕竟系统.https:/ ...

  5. ASP.NET MVC中Section、Partial View 和 Child Action(转载)

    概括的讲,View中的内容可以分为静态和动态两部分.静态内容一般是html元素,而动态内容指的是在应用程序运行的时候动态创建的内容.给View添加动态内容的方式可归纳为下面几种: Inline cod ...

  6. C\C++ vector 构造函数 & 析构函数

    #include <iostream> #include <vector> using namespace std; class Obj { public: Obj(void) ...

  7. CCF 201709-1打酱油

    问题描述 小明带着N元钱去买酱油.酱油10块钱一瓶,商家进行促销,每买3瓶送1瓶,或者每买5瓶送2瓶.请问小明最多可以得到多少瓶酱油. 输入格式 输入的第一行包含一个整数N,表示小明可用于买酱油的钱数 ...

  8. vue实现分页

    效果图: html页面: data数据: 方法: 计算属性: 样式: html代码: <!--分页--> <div class="page-bar"> &l ...

  9. Linux开机自启动脚本

    将需要开机自启动的脚本命令写在文件/etc/rc.d/rc.local中即可. 比如需要开机自启动MySql和Apache,则在/etc/rc.d/rc.local文件尾部加入两行命令: system ...

  10. angular自定义过滤器在页面和控制器中的使用

    首先设置自定义过滤器. 定义模块名:angular .module('myApp') .filter('filterName',function(){ return function(要过滤的对象,参 ...