本章目录:

    一、多态

    二、多态性

    三、鸭子类型

==============================

一、多态

  多态指的是一类事物有多种形态.

  动物有多种形态:人,狗,猪.

  1. import abc
  2. class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
  3. @abc.abstractmethod
  4. def talk(self):
  5. pass
  6.  
  7. class People(Animal): #动物的形态之一:人
  8. def talk(self):
  9. print('say hello')
  10.  
  11. class Dog(Animal): #动物的形态之二:狗
  12. def talk(self):
  13. print('say wangwang')
  14.  
  15. class Pig(Animal): #动物的形态之三:猪
  16. def talk(self):
  17. print('say aoao')

  linux中“一切皆文件”,文件具有可写可读特性:

  1. import abc
  2. class File(metaclass=abc.ABCMeta): #同一类事物:文件
  3. @abc.abstractmethod
  4. def click(self):
  5. pass
  6.  
  7. class Text(File): #文件的形态之一:文本文件
  8. def click(self):
  9. print('open file')
  10.  
  11. class ExeFile(File): #文件的形态之二:可执行文件
  12. def click(self):
  13. print('execute file')

 

二、多态性

  1. 什么是多态动态绑定(在继承的背景下使用时,有时也称为多态性)

    多态性是指在不考虑实例类型的情况下使用实例。

  1. 在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
  2.  
  3. 比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同

  多态性分为静态多态性和动态多态性:

    静态多态性:如任何类型都可以用运算符+进行运算

    动态多态性:

  1. peo=People()
  2. dog=Dog()
  3. pig=Pig()
  4.  
  5. #peo、dog、pig都是动物,只要是动物肯定有talk方法
  6. #于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
  7. peo.talk()
  8. dog.talk()
  9. pig.talk()
  10.  
  11. #更进一步,我们可以定义一个统一的接口来使用
  12. def func(obj):
  13. obj.talk()

  2. 为什么要用多态性(多态性的好处)

    其实大家从上面多态性的例子可以看出,我们并没有增加什么新的知识,也就是说python本身就是支持多态性的,这么做的好处是什么呢?

    

    1.增加了程序的灵活性

      以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)

    2.增加了程序额可扩展性

      通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用 

  1. >>> class Cat(Animal): #属于动物的另外一种形态:猫
  2. ... def talk(self):
  3. ... print('say miao')
  4. ...
  5. >>> def func(animal): #对于使用者来说,自己的代码根本无需改动
  6. ... animal.talk()
  7. ...
  8. >>> cat1=Cat() #实例出一只猫
  9. >>> func(cat1) #甚至连调用方式也无需改变,就能调用猫的talk功能
  10. say miao
  11.  
  12. '''
  13. 这样我们新增了一个形态Cat,由Cat类产生的实例cat1,使用者可以在完全不需要修改自己代码的情况下。使用和人、狗、猪一样的方式调用cat1的talk方法,即func(cat1)
  14. '''

 

三 、鸭子类型

  1. Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’

python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

  1. #二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
  2. class TxtFile:
  3. def read(self):
  4. pass
  5.  
  6. def write(self):
  7. pass
  8.  
  9. class DiskFile:
  10. def read(self):
  11. pass
  12. def write(self):
  13. pass

例2:其实大家一直在享受着多态性带来的好处,比如Python的序列类型有多种形态:字符串,列表,元组,多态性体现如下

  1. #str,list,tuple都是序列类型
  2. s=str('hello')
  3. l=list([1,2,3])
  4. t=tuple((4,5,6))
  5.  
  6. #我们可以在不考虑三者类型的前提下使用s,l,t
  7. s.__len__()
  8. l.__len__()
  9. t.__len__()
  10.  
  11. len(s)
  12. len(l)
  13. len(t)

Python入门之面向对象的多态的更多相关文章

  1. Python入门之面向对象的多态和继承

    本章内容 Python面向对象的多态和继承对比 ========================================= 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的 ...

  2. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  3. Python入门篇-面向对象概述

    Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...

  4. Python入门之面向对象的__init__和__new__方法

    Python入门之面向对象的__init__和__new__方法

  5. python之路----面向对象的多态特性

    多态 多态指的是一类事物有多种形态 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstr ...

  6. Python入门之面向对象编程(一)面向对象概念及优点

    概念 谈到面向对象,很多程序员会抛出三个词:封装.继承和多态:或者说抽象.一切都是对象之类的话,然而这会让初学者更加疑惑.下面我想通过一个小例子来说明一下 面向对象一般是和面向过程做对比的,下面是一个 ...

  7. Python入门-初始面向对象

    之前我们代码基本上都是面向过程的,今天我们就来初始一下python中一个重要的内容:面向对象 一.面向对象和面向过程(重点理解) 1.面向过程: 一切以事物的流程为核心. 核心是"过程&qu ...

  8. Python入门之面向对象编程(四)Python描述器详解

    本文分为如下部分 引言——用@property批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法.静态方法和类方法的描述器原理 property装饰 ...

  9. python入门18 继承和多态

    继承:子类继承父类的属性和方法  class 子类名(父类1,父类2) 多态:子类重写父类的方法 判断对象是否是某个类的实例:  isinstance(object,class) 父类-汽车类 #co ...

随机推荐

  1. 对Yii2中 yii\web\User的理解,和自建的app\models\User(基础版),frontend\models\User的应用原理

    yii\web\User 是一个统称,为用户,没有具体实例,只能管理: 此处以app\models\User为基准: app\models\User 是映射数据表user的model类,同时也实现接口 ...

  2. Saltstack之SaltSyndic

    SaltSyndic 1,SaltSyndic必须运行在salt-master上面 2,Syndic要连接另外一个Master比它更高级 在master安装syndic yum -y install ...

  3. TOP100summit:【分享实录】爆炸式增长的斗鱼架构平台的演进

    本篇文章内容来自2016年TOP100summit斗鱼数据平台部总监吴瑞城的案例分享. 编辑:Cynthia 吴瑞诚:斗鱼数据平台部总监 曾先后就职于淘宝.一号店. 从0到1搭建公司大数据平台.平台规 ...

  4. cordova-ios 升级到4.4.0 无法真机跑iOS8 报错: dyld`dyld_fatal_error: -> 0x120085088 <+0>: brk #0x3

    项目进入测试阶段,马上要上线了,同事拿了自己的iOS8系统5s跑真机,无缘无故报错,之前跑她的手机完全没有问题的.Xcode 8.x中最低部署版本是iOS8.0,按理说完全能够跑真机的. 但是报了一个 ...

  5. linux 批量文件查找并替换

    linux 批量文件查找并替换 sed -i "s/oldstring/newstring/g" `grep oldstring -rl path` 如: sed -i " ...

  6. jquery表格展示

    用bootstrap设计一个弹框,然后在弹框里面生成表格 <html> <head> <link rel="stylesheet" href=&quo ...

  7. 洛谷P1903 数颜色 [国家集训队] 莫队

    正解:带修莫队 解题报告: 可以理解为引入时间参数,然后就是有了仨参数,关于这个修改同样的是,如果时间是相同的,不用搞,如果时间不相同做一下时光倒流/时光推移就成嘛 但是肯定既然这样的话,按照原来的s ...

  8. BUG笔记:Win8 IE10下input[type="password"]内字符显示被截取问题

    这个BUG发生的截图: 这是发生在Windows8 IE10下,type为password的input文本框内输入长串字符后,初次失去焦点的时候会发生的一个BUG. 发生BUG的原因是这个文本框上应用 ...

  9. 解决 libev.so.4()(64bit) is needed by percona-xtrabackup-2.3.4-1.el6.x86_64案例

    在mysql主从同步时经常会用到Xtra, XtraBackup可以说是一个相对完美的免费开源数据备份工具,支持在线无锁表同步复制和可并行高效率的安全备份恢复机制相比mysqldump来说优势较大好处 ...

  10. SDUTOJ2465:其实玩游戏也得学程序(bfs+优先队列+回溯)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2465 题目描述 由于前两次的打击,ZYJ同学不 ...