老生常谈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中处理unchecked未捕获异常实例
Jan 17 Python
Python用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
Python单元测试unittest的具体使用示例
Dec 17 Python
python抓取搜狗微信公众号文章
Apr 01 Python
numpy concatenate数组拼接方法示例介绍
May 27 Python
python之mock模块基本使用方法详解
Jun 27 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
python中编写函数并调用的知识点总结
Jan 13 Python
pycharm 复制代码出现空格的解决方式
Jan 15 Python
python中Pexpect的工作流程实例讲解
Mar 02 Python
Python os和os.path模块详情
Apr 02 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
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python中内建函数的简单用法说明
2016/05/05 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
记者岗位职责
2014/01/06 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
交通事故被告代理词
2015/05/23 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
城南旧事读书笔记
2015/06/29 职场文书
《海上日出》教学反思
2016/02/23 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
如何在Python中创建二叉树
2021/03/30 Python
golang正则之命名分组方式
2021/04/25 Golang
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android