老生常谈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程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
Python实现的RSS阅读器实例
Jul 25 Python
python爬虫之百度API调用方法
Jun 11 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
Python使用统计函数绘制简单图形实例代码
May 15 Python
python适合人工智能的理由和优势
Jun 28 Python
python读写配置文件操作示例
Jul 03 Python
Python基于Tensor FLow的图像处理操作详解
Jan 15 Python
pandas使用之宽表变窄表的实现
Apr 12 Python
使用Python实现微信拍一拍功能的思路代码
Jul 09 Python
Restful_framework视图组件代码实例解析
Nov 17 Python
python3美化表格数据输出结果的实现代码
Apr 14 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 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
javascript 函数速查表
2010/02/07 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
js实现微信聊天效果
2020/08/09 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
Python3 操作符重载方法示例
2017/11/23 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
深入探究HTML5的History API
2015/07/09 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
大学生个人事迹材料
2014/01/21 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript