老生常谈python之鸭子类和多态


Posted in Python onJune 13, 2017

一、 什么是多态

<1>一种类型具有多种类型的能力
<2>允许不同的对象对同一消息做出灵活的反应
<3>以一种通用的方式对待个使用的对象
<4>非动态语言必须通过继承和接口的方式来实现

二、 python中的多态

<1>通过继承实现多态(子类可以作为父类来使用)
<2>子类通过重载父类的方法实现多态

class Animal:
  def move(self):
    print('animal is moving....')
class Dog(Animal):
  pass
def move(obj):
  obj.move()

>>>move(Animal())
>>>animal is moving....
>>>move(Dog())
>>>animal is moving....

class Fish(Animal):
  def move(self):
    print('fish is moving....')
>>>move(Fish())
>>>fish is moving....

三、 动态语言和鸭子类型

<1>变量绑定的类型是不确定的

<2>函数和方法可以接收任何类型的参数

<3>调用方法时不检查提供的参数类型

<4>调用是否成功有参数的方法和属性确定,调用不成功则抛出错误

<5>不用实现接口

class P:
  def __init__(self, x, y):
    self.x = x
    self.y = y
  def __add__(self, oth):
    return P(self.x+oth.x, self.y+oth.y)
  def info(self):
    print(self.x, self.y)
class D(P):
  def __init__(self, x, y, z):
    super.__init__(x, y)
    self.z = z

  def __add__(self, oth):
    return D(self.x+oth.x, self.y+oth.y, self.z+oth.z)
  def info(self):
    print(self.x, self.y, self.z)

class F:
  def __init__(self, x, y, z):
    self.x = x
    self.y = y
    self.z = z

  def __add__(self, oth):
    return D(self.x+oth.x, self.y+oth.y, self.z+oth.z)
  
  def info(self):
    print(self.x, self.y, self.z)
  

def add(a, b):
  return a + b

if __name__ == '__main__':
  add(p(1, 2), p(3, 4).info())
  add(D(1, 2, 3), D(1, 2, 3).info())
  add(F(2, 3, 4), D(2, 3, 4).info())

四、 多态的好处

<1>可实现开放的扩展和修改的封闭

<2>使python程序更加的灵活

以上这篇老生常谈python之鸭子类和多态就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python函数中定义参数的四种方式
Nov 30 Python
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
Laravel+Dingo/Api 自定义响应的实现
Feb 17 Python
使用python os模块复制文件到指定文件夹的方法
Aug 22 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
pytest中文文档之编写断言
Sep 12 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 26 Python
浅谈scrapy 的基本命令介绍
Jun 13 #Python
python生成词云的实现方法(推荐)
Jun 13 #Python
Python实现Linux中的du命令
Jun 12 #Python
python正则表达式的使用
Jun 12 #Python
Python简单删除列表中相同元素的方法示例
Jun 12 #Python
Python实现删除列表中满足一定条件的元素示例
Jun 12 #Python
Ubuntu 下 vim 搭建python 环境 配置
Jun 12 #Python
You might like
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
用js生产批量批处理执行命令
2008/07/28 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
Python聊天室实例程序分享
2016/01/05 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
Django中的forms组件实例详解
2018/11/08 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
华为c/c++笔试题
2016/01/25 面试题
电子商务应届生求职信
2013/11/16 职场文书
赔偿协议书范本
2014/04/15 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
收入证明申请书
2015/06/12 职场文书
小学科学课教学反思
2016/02/23 职场文书
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers