大家都知道面向对象的三大特性:封装,继承,多态。封装特性在上一章节已经讲解过。这一章节主要讲解继承和多态。

继承:当定义一个类的时候,可以从现有的类进行继承。那么新定义的类可以称为子类,被继承的现有的类称为基类,父类或者超类。

上一章节大家应该有所注意以下代码:

>>> class Animal(object):

pass

object类是python所有类的基类,Animal类是object类的子类。Animal类继承于object类。

继承到底有什么好处?举个例子:

>>> class Animal(object):

def call(self):

print('Animal is calling!')

>>> class dog(Animal):

pass

>>> dog = dog()

>>> dog.call()

Animal is calling!

dog类继承了Animal类,当声明了一个dog实例对象后,可以直接调用父类Animal的call方法。

这就是继承的好处,能够直接继承来自父类的属性和方法,然后直接调用。这样就精简了代码,提高了代码的复用性。

如果父类在实例化对象的时候,要默认传入name参数的话,子类dog继承的时,应该怎么办?

例子:

>>> class Animal(object):

def __init__(self,name):

self.name = name

def call(self):

print ('Animal is calling!')

>>> class dog(Animal):

def __init__(self,name,birth):

super(dog,self).__init__(name)//大家注意这句代码

self.birth = birth

def call(self):

print ('dog is calling!')

>>> dog = dog('wangcai','2016-8-5')

>>> print dog.name

wangcai

>>> print dog.birth

2016-8-5

函数super(dog, self)将返回当前类继承的父类,即Animal,然后调用__init__()方法,注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写).

大家发现,dog子类也定义了一个call方法。那么实例化dog对象,dog.call()会发生什么?

多态>>> dog.call()

dog is calling!

当子类和父类都存在相同的call()方法时,我们说,子类的call()覆盖了父类的call(),在代码运行的时候,总是会调用子类的call()。类似于C++的虚函数或者java的抽象方法。

在理解多态之前,要判断一个对象/变量是否属于某一个类/类型,使用isinstance方法。

>>> class Animal(object):

def call(self):

print('Animal is calling!')

>>> class dog(Animal):

def call(self):

print('dog is calling!')

>>> d =dog()

>>> a =Animal()

>>> isinstance(d,Animal)

True

>>> isinstance(a,dog)

False

看来,d不仅仅是dog,而且还是animal。而a 虽然是animal,但是不一定是dog,也有可能是cat。所以isinstance(a,dog)返回为false。

所以在继承关系中,如果一个实例的数据类型是某个子类,那么它的数据类型也可以被看做是父类。所以isinstance(d,Animal)返回为True。

有个上述的理解,那么我们再举个例子。

>>> def lound_call(animal):

animal.call()

>>> lound_call(dog())

dog is calling!

>>> lound_call(Animal())

Animal is calling!

新增一个Animal子类cat。

>>> class Cat(Animal):

def call(self):

print('cat is calling!')

>>> lound_call(Cat())

cat is calling!

你会发现,新增一个Animal的子类,不必对lound_call()做任何修改,实际上,任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。

多态的好处就是,当我们需要传入Dog、Cat……时,我们只需要接收Animal类型就可以了,因为Dog、Cat……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有call()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的call()方法,这就是多态的意思:

对于一个变量,只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用call()方法,而具体调用的call()方法是作用在Animal、Dog、Cat对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保call()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:

对扩展开放:允许新增Animal子类;

对修改封闭:不需要修改依赖Animal类型的lound_call()等函数。

小结:这一章节主要讲解了python面向对象的属性继承和多态。

python继承和多态心得_python学习第十五天 -面向对象之继承和多态相关推荐

  1. python复制指定字符串_python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  2. python中继承和组合的区别_Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类...

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

  3. 宁波python学习_python学习第十五天

    CSS属性 position postition:fixed;top:0;right:0     fixed代表将标签固定在整个页面某个位置,top,right,left,bottom代表与四边的距离 ...

  4. python中xml模块_python学习第十五天-2(XML模块)

    也是一种文本转换形式. import xxxxxxxxxxxxxxxxxxx  as xx,可以用xx代替xxxxxxxxxxxxxxxxxxx模块 xml文件的新增,修改,删除,查询. 新增:​ i ...

  5. python动态捕捉屏幕_python学习(十五) 屏幕抓取

    15.1 屏幕抓取 15.1.1 Tidy和XHTML解析 Tidy:用来修复不规范且随意的HTML文档的工具. 为什么用XHTML: 和旧版本的HTML之间最主要的区别:HTML可能只用一个开始标签 ...

  6. Java学习系列(十五)Java面向对象之细谈线程、线程通信(下)

    竞争资源(共享资源):如果有多条线程需要并发访问.并修改某个对象,该对象就是"竞争资源".为了避免多个线程"自由竞争"修改共享资源所导致的不安全问题. 线程同步 ...

  7. python数据挖掘学习】十五.Matplotlib调用imshow()函数绘制热图

    python数据挖掘学习]十五.Matplotlib调用imshow()函数绘制热图 #2018-03-28 14:47:19 March Wednesday the 13 week, the 087 ...

  8. python学习[第十五篇] 文件系统

    python学习[第十五篇] 文件系统 对文件系统访问大多数都通过os模块实现. os 模块文件/目录访问函数 文件处理 mkfifo() 创建命名通道只用于linux remove(path)/un ...

  9. Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

    Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件 用Polyworks脚本开发,没有高级语言的支持,功能难免单一,一些比较复杂的交互实现不了,界面和报告也很 ...

最新文章

  1. 不能用 + 拼接字符串? 这次我要吊打面试官!
  2. 聊聊LightProbe原理实现以及对LightProbe数据的修改
  3. Django之项目搭建和配置总结(一)
  4. 如何利用python将mp4文件转换为gif文件 + 代码分享 另附在线转换网址
  5. Java 和C# 最大的不同是对底层的控制能力不同
  6. 泛微OA项目引入jar包说明
  7. linux开启防火墙教程,linux系统开启防火墙及开放端口操作步骤
  8. excel计算机快捷键大全,常用的Excel快捷键大全
  9. 易语言教程数据库删除命令
  10. 计算机msvcp110.dll丢失,msvcp110.dll丢失怎样修复
  11. Windows消息类型及说明(全面)
  12. 群晖能不能像服务器一样共享桌面,电脑桌面与群晖NAS双向实时同步
  13. OllyDebug破解第一个 CM 程序 《Acid burn.exe》
  14. 基于C/C++语言的停车场管理系统编程课程设计超详细
  15. 使用Glide加载圆角矩形图片、圆形图片
  16. 养生“六伤”、“十二莫”、“十二少”
  17. SAP S4 FI 后台详细配置教程文档 PART2 (财务会计的基本设置篇)
  18. Ad Hoc网络的概述
  19. 一个博士的深度调查:中国农村男青年“高价娶妻”研究
  20. 上海星尚传媒主持人刘彦池

热门文章

  1. 为什么要用MQ,MQ是什么?(消息队列)
  2. 资格考试_第四章_证券投资基金的监督
  3. 记一次完整手机APP项目的开发
  4. 大端模式和小端模式的详细区别
  5. 财报数据知冷暖:欧洲电信市场整体复苏中
  6. MATLAB 相机标定中标定板角点像素坐标系到世界坐标系的转换
  7. matlab修改图像分辨率_matlab imresize 改变图像大小
  8. FTTB+NAT+DHCP+pppoe+CBAC+*** client+Authentication AAA
  9. ES6代码转换为ES5的代码
  10. 前端学习——HTML(一)