老生常谈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中文编码问题小结
Sep 28 Python
Python的math模块中的常用数学函数整理
Feb 04 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 Python
python实现感知机线性分类模型示例代码
Jun 02 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
Python适配器模式代码实现解析
Aug 02 Python
Python通过cv2读取多个USB摄像头
Aug 28 Python
pymysql 开启调试模式的实现
Sep 24 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
pygame用blit()实现动画效果的示例代码
May 28 Python
python 爬虫之selenium可视化爬虫的实现
Dec 04 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根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php源码的使用方法讲解
2019/09/26 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
JSON格式化输出
2014/11/10 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
jQuery中Ajax的get、post等方法详解
2015/01/20 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
Python 字符串定义
2009/09/25 Python
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
Python assert语句的简单使用示例
2019/07/28 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
创意广告词
2014/03/17 职场文书
优秀教师事迹材料
2014/12/15 职场文书
2015年推普周活动方案
2015/05/06 职场文书
电影雷锋观后感
2015/06/10 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技