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. python基础整理7——爬虫——爬虫开发工具

    HTTP代理神器Fiddler Fiddler是一款强大Web调试工具,它能记录所有客户端和服务器的HTTP请求. Fiddler启动的时候,默认IE的代理设为了127.0.0.1:8888,而其他浏 ...

  2. python list 使用技巧

    格式:list[start:stop:step] 示例:a =list(range(0,10))print(a[1:8:2]) #[1, 3, 5, 7]print(a[:8:2]) #[0, 2, ...

  3. Ubuntu下查看自己的GPU型号

    1.在命令行中输入:lspci 即可看到当前显卡型号. 2.Ubuntu 14.04 安装 Nvidia 私有驱动 sudo apt-get install nvidia-331 3.进行双显卡切换n ...

  4. [图解tensorflow源码] [转载] tensorflow设备内存分配算法解析 (BFC算法)

    转载自 http://weibo.com/p/1001603980563068394770   @ICT_吴林阳 tensorflow设备内存管理模块实现了一个best-fit with coales ...

  5. 观察者模式及c++实现

     观察者模式概念:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并自己主动更新."Define a one-to-many dependenc ...

  6. BAT面试总结——iOS开发高级工程师

    序言 之前也面试别人,现在轮到自己找工作,怎么说呢,现在轮到自己出去面试,怎么说呢,其实还是挺紧张的,原以为自己不会因此紧张或者焦虑,实际上,还是有的,在没找到合适的工作的时候,甚至晚上有点睡不着觉, ...

  7. Xamarin 编写混合APP趟坑记录(二)

    前言 公司要开发一个App,为了便于维护和更新,而不用每次去苹果审核,采用的是混合开发方式:用WebVie+WebApp的方式. 因为本人不会Java和ObjectC,公司又不想花钱招这两个岗位的人, ...

  8. zabbix服务快速搭建指南

    zabbix监控服务快速安装指南 1.更换centos7-base源为阿里源  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.ali ...

  9. 如何方便的结果ajax使用html5的新type类型

    今天需要做手机端的输入表单自动生成器,突然就想到了手机端对input的输入类型支持还不错,于是翻遍了资料,有了下面的使用方法,闲话少说,上正文: html5现在可以用的新input type类型一共有 ...

  10. PHP操作xml学习笔记之增删改查(2)—删、改、查

    xml文件 <?xml version="1.0" encoding="utf-8"?><班级>    <学生>       ...