多态

多态是面向对象的三大特征之一。

多态从字面上理解是多种形态。例如:狗有多个种类(狼狗、藏獒、哈士奇、古代牧羊犬...)。

一个对象可以以不同的形态去呈现。

我们先来定义两个类:

class A:

def __init__(self,name):

self._name = name

@property

def name(self):

return self._name

@name.setter

def name(self,name):

self._name = name

class B:

def __init__(self,name):

self._name = name

@property

def name(self):

return self._name

@name.setter

def name(self,name):

self._name = name

a = A('孙悟空')

b = B('猪八戒')

定义一个函数:

def say_hello(obj):

print('你好 %s'%obj.name)

# say_hello(a)

say_hello(b)

执行结果:

我们来再定义一个C类,c是否可以作为参数传入say_hello:

class C:

pass

c = C()

say_hello(c)

执行结果:

对于say_hello()这个函数来说,只要对象中含有name属性,它就可以作为参数传递,这个函数并不会考虑对象的类型,只要有name属性即可。

我们再来定义一个没有多态属性的函数:

def say_hello_2(obj):

# 做类型检查

if isinstance(obj , A):

print('你好 %s'%obj.name)

# say_hello_2(a)

say_hello_2(b)

执行结果:

在say_hello_2中我们做了一个类型检查,也就是只有obj是A类型的对象时,才可以正常使用,其他类型的对象都无法使用该函数,这个函数就违反了多态。违反了多态的函数,只适用于一种类型的对象,无法处理其他类型对象,这样导致函数的适应性非常的差。

多态的描述:

鸭子类型

如果一个东西,走路像鸭子,叫声像鸭子,那么它就是鸭子。

我们通过一个例子来说明

len()

l = [1,2,3]

s = 'hello'

print(len(l))

print(len(s))

执行结果:

之所以一个对象能通过len()来获取长度,是因为对象中具有一个特殊方法__len__。

换句话说,只要对象中具有__len__特殊方法,就可以通过len()来获取它的长度。

我们在B中定义一个len()

def __len__(self):

return 10

print(len(b))

print(len(c))

执行结果:

B中有len()方法,所以有返回值,但是C中没有,所以程序出错。

注意,像isinstance()这种函数,在开发中一般是不会使用的!可能违反多态。

我们总结一下面向对象的三大特征:

封装

确保对象中的数据安全

继承

保证了对象的可扩展性

多态

保证了程序的灵活性

获取更多资源请订阅Python学习站

python 多态app_多态简介 | Python从入门到精通:高阶篇之三十三-阿里云开发者社区...相关推荐

  1. python高手之路第三版_《Python高手之路(第3版)》——1.3 版本编号-阿里云开发者社区...

    本节书摘来自异步社区<Python高手之路(第3版)>一书中的第1章,第1.3节,作者[法]Julien Danjou,王飞龙 译,更多章节内容可以访问云栖社区"异步社区&quo ...

  2. python中shutil模块_python文件、文件夹、压缩包处理模块-shutil模块-阿里云开发者社区...

    shutil模块 高级的文件.文件夹.压缩包 处理模块 本节内容基本在linux下python交互环境实现 复制移动文件.文件夹 将文件内容拷贝到另一个文件中,可以部分内容 格式如下: ``` shu ...

  3. python标准库有pickle_Python标准库05 存储对象 (pickle包,cPickle包)-阿里云开发者社区...

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在之前对Python对象的介绍中 (面向对象的基本概念,面向对象的进一步拓展),我 ...

  4. python中执行shell命令_python中执行shell命令的几个方法小结-阿里云开发者社区

    Python 执行 shell 命令 最近有个需求就是页面上执行shell命令,第一想到的就是os.system os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令 ...

  5. python合法标识符 40xl_Python基础测验(答案篇)-问答-阿里云开发者社区-阿里云

    一.填空题 Python使用符号 # 标示单行注释:以 缩进对齐 划分语句块. Python序列类型包括 字符串 . 列表 . 元组 三种: _字典_是Python中唯一的映射类型. Python序列 ...

  6. boost库 python_Boost.Python简介-阿里云开发者社区

    Boost.Python简单概括:是Boost库的一部分:用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针. 简介 BoostPython库让C+ ...

  7. python树莓派编程 沃尔弗拉姆_《 Python树莓派编程》——3.3 Python入门-阿里云开发者社区...

    本节书摘来自华章出版社<Python树莓派编程>一书中的第3章,第3.3节,作者:[美]沃尔弗拉姆·多纳特(Wolfram Donat)著韩德强 等译,更多章节内容可以访问云栖社区&quo ...

  8. python编写程序 计算1_《Python程序设计》——第1章 计算与问题求解简介 1.1 计算与Python简介-阿里云开发者社区...

    本节书摘来自华章计算机<Python程序设计>一书中的第1章,第1.1节,作者:[美]戴维 I.施奈德(David I. Schneider)著,更多章节内容可以访问云栖社区"华 ...

  9. python es 数据库 复合查询bool_es 入门-阿里云开发者社区

    **注意事项-------使用ealsticsearch要配置java的开发环境JDK(1.8以上) ealsticsearch:               索引(Index)    类型(type ...

最新文章

  1. 把项目发到github
  2. Mac用Java写出hello,mac中c#的helloworld
  3. Google 是如何定制 Material 主题的?
  4. Linux oracle数据库自动备份自动压缩脚本代码
  5. wxWidgets:wxRichTextCtrl类用法
  6. 你必须足够强大,这个世界才会更加公平
  7. node 版本升级_Node-RED: 自动化事件触发工具的安装与介绍
  8. javascript实例自学手册光盘源码_零基础,自学编程,如何选择语言?
  9. sql示例_SQL Server Lead功能概述和示例
  10. RabbitMQ heartbeat原理
  11. 恶意软件\垃圾流氓通用反删除批处理文件
  12. 免费升级win10系统方法
  13. Java毕设项目超市进销存管理系统计算机(附源码+系统+数据库+LW)
  14. kubernetes入门之Downward API
  15. Unity功能点---模拟枪械射击时的后坐力
  16. 基于FPGA低频方波测量-频率与占空比
  17. 列举网络爬虫所用到的网络数据包,解析包?
  18. 第二届电气、机械与计算机工程国际学术会议(ICEMCE2018)简单记录
  19. Win10 home vs pro vs enterprise vs enterprise LTSC
  20. Atom编辑器:基本使用

热门文章

  1. C++——set基本操作总结
  2. 绕口令:《舌头是怎样练成的》
  3. Js日期函数-Date方法
  4. 系统监控的四个黄金指标
  5. STM32SPI通信原理
  6. JavaSE常见面试题
  7. Android 10 设置kernel log level
  8. 23、Numpy IO
  9. Python实现批量修改图片名称并存入新文件夹
  10. 使用Selenium从IEEE与谷歌学术批量爬取BibTex文献引用