什么是Python的多态?

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

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

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

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

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

多态即多种形态,在运行时确定其状态,在编译阶段无法确定其类型,这就是多态。Python中的多态和Java以及C++中的多态有点不同,Python中的变量是弱类型的,在定义时不用指明其类型,它会根据需要在运行时确定变量的类型(个人觉得这也是多态的一种体现),并且Python本身是一种解释性语言,不进行预编译,因此它就只在运行时确定其状态,故也有人说Python是一种多态语言。在Python中很多地方都可以体现多态的特性,比如内置函数len(object),len函数不仅可以计算字符串的长度,还可以计算列表、元组等对象中的数据个数,这里在运行时通过参数类型确定其具体的计算过程,正是多态的一种体现。这有点类似于函数重载(一个编译单元中有多个同名函数,但参数不同),相当于为每种类型都定义了一个len函数。这是典型的多态表现。有些朋友提出Python不支持多态,我是完全不赞同的。   本质上,多态意味着可以对不同的对象使用同样的操作,但它们可能会以多种形态呈现出结果。len(object)函数就体现了这一点。在C++、Java、C#这种编译型语言中,由于有编译过程,因此就鲜明地分成了运行时多态和编译时多态。运行时多态是指允许父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类类型方法,这就是所谓的动态绑定。编译时多态有模板或范型、方法重载(overload)、方法重写(override)等。而Python是动态语言,动态地确定类型信息恰恰体现了多态的特征。在Python中,任何不知道对象到底是什么类型,但又需要对象做点什么的时候,都会用到多态。

有一种称为”鸭子类型(duck typing)“的东西,讲的也是多态:

_metaclass_=type # 确定使用新式类

class Duck:

def quack(self):

print "Quaaaaaack!"

def feathers(self):

print "The duck has white and gray feathers."

class Person:

def quack(self):

print "The person imitates a duck."

def feathers(self):

print "The person takes a feather from the ground and shows it."

def in_the_forest(duck):

duck.quack()

duck.feathers()

def game():

donald = Duck()

john = Person()

in_the_forest(donald)

in_the_forest(john)

game()

就in_the_forest函数而言,参数对象是一个鸭子类型,它实现了方法多态。但是实际上我们知道,从严格的抽象来讲,Person类型和Duck完全风马牛不相及。

运算符多态

def add(x,y):

return x+y

print add(1,2) #输出3

print add("hello,","world") #输出hello,world

print add(1,"abc") #抛出异常 TypeError: unsupported operand type(s) for +: 'int' and 'str'

Python的加法运算符是”多态“的,理论上,我们实现的add方法支持任意支持加法的对象,但是我们不用关心两个参数x和y具体是什么类型。

Python同样支持运算符重载

class Vector:

def __init__(self, a, b):

self.a = a

self.b = b

def __str__(self):

return 'Vector (%d, %d)' % (self.a, self.b)

def __add__(self,other):

return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)

v2 = Vector(5,-2)

print v1 + v2

在C++, Java, C#中实现多态的方式通常有重写和重载两种,从上面两段代码,我们其实可以分析得出Python中实现多态也可以变相理解为重写和重载。在Python中很多内置函数和运算符都是多态的。

[Reference]https://vancele.gitbooks.io/python/content/chapter7.html

python面向对象编程思想书籍_Python的面向对象编程思想相关推荐

  1. python竞赛试题及答案_Python全国少儿编程竞赛参赛作品《自主数学练习小工具》解析...

    本文介绍的作品是全国青少年创意编程与智能设计大赛创意编程比赛张佳栩同学的参赛作品. 这篇文章我们继续讲解Python语言的内容,这次要学习的是张佳栩同学开发的自主数学练习小工具,上面的作品说明很简单明 ...

  2. python类的构造方法名称_Python的面向对象、Class 概念与使用

    Class(类)的基本概念: 类:将同一种具体事务的共同点抽象出来的表现,Python的类是一种可调用对象. 类中定义的有方法,变量,数据结构. 变量则是类属性本身是没有数据的,只有在实例化的时候将数 ...

  3. python普通类实现接口_python之面向对象(接口和抽象类)

    一.接口 什么是接口 继承有两种用途: 1:继承基类的方法,并且做出自己的改变或者扩展(代码重用). 2:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  4. python微控制器编程从零开始下载_Python微控制器编程从零开始(使用MicroPython)...

    目 录 第1章 概述 1 1.1 MicroPython简介 1 1.2 设计思想 2 1.3 MicroPython探究 2 1.4 面向对象编程和一些Python基础 4 1.4.1 面向对象的概 ...

  5. python微控制器编程从零开始下载_Python微控制器编程从零开始 使用MicroPython

    目 录 第1章 概述 1 1.1 MicroPython简介 1 1.2 设计思想 2 1.3 MicroPython探究 2 1.4 面向对象编程和一些Python基础 4 1.4.1 面向对象的概 ...

  6. python创意编程是什么_Python趣味创意编程

    第 1 章 Python与Processing介绍 1 1.1 什么是Python 1 1.2 Processing下载与配置 2 1.3 小结 4 第 2 章 转动眼珠的圆脸 5 2.1 显示一个圆 ...

  7. python爬取豆瓣书籍_Python 爬取豆瓣读书标签下的书籍

    这几天想爬下豆瓣读书时发现 github 上他人分享的源码都有一定年份了,豆瓣读书的页面貌似也稍微改了,于是就在前人轮子的基础上改进一下重新爬下豆瓣读书.Python 版本是 3.7. 1.爬取信息 ...

  8. python编程思维培养_Python教学:编程如何培养学生计算思维-最新教育资料

    Python 教学:编程如何培养学生计算思维 从去年开始, 身边的很多教师都在议论同样的话题: "信 息技术教材要改革了, 据说是大变样. ""高中信息技术可能要 换一门 ...

  9. python标签控件是_Python 图形用户界面编程

    Python 图形用户界面编程python Python的默认GUI工具集是Tk,咱们能够经过Python的Tkinter接口来使用Tk.编程 咱们能够跟以前同样,经过import来引入Tk,能够先在 ...

最新文章

  1. 频频曝出程序员被抓,我们该如何避免面向监狱编程?
  2. 记一次suse linux崩溃
  3. 社区团购的终局会是近景零售版的拼多多吗?
  4. Cpp 对象模型探索 / new 对象时加括号和不加括号时的差别
  5. [转]expect的安装
  6. html和css知识,html和 css基础知识
  7. linuxoracle静默安装应答文件修改_Oracle 19c的examples静默安装
  8. [Programming WCF Services]Chapter 1. WCF Essentials - Metadata Exchange
  9. Power Automate Desktop概览
  10. Matlab和C++混合编程
  11. 怎么样把Java的字符串转化为字节数组?
  12. 发际线预警!10本程序员必读烧脑经典,你敢挑战一本吗?
  13. kafka通过控制台模拟消息发送和消息接收正常,但是通过javaAPI操作生产者发送消息不成功 消费者接收不到数据解决方案?
  14. 初学Rman 写的备份脚本
  15. 计算机odbc数据源管理位置,ODBC 常见数据源配置整理
  16. 显示器尺寸对照表_常见像素和显示屏大小对照表
  17. JQuery将用户输入的数字转换为大写
  18. 《认知心理学》思维导图
  19. AD7760数据采集系统设计 [FPGA逻辑设计]
  20. CentOS下切换桌面模式与命令行模式

热门文章

  1. 在ASP.NET Core Web API上使用Swagger提供API文档
  2. Microsoft宣布.NET Core支持计划
  3. 架构师必须知道的架构设计原则
  4. GPS实验三:GPS接收机野外数据采集
  5. 【经典回放】多种语言系列数据结构算法:串(C版)
  6. LeetCode之Missing Number
  7. linux之telnet命令使用
  8. Android之 ListView滑动时不加载图片
  9. 链表之删除链表中间节点
  10. Android之View基础总结(View的事件体系一)