老生常谈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 21 Python
Python写的Tkinter程序屏幕居中方法
Mar 10 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
matplotlib绘图实例演示标记路径
Jan 23 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
Python异常处理操作实例详解
May 10 Python
在python带权重的列表中随机取值的方法
Jan 23 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
对python中assert、isinstance的用法详解
Nov 27 Python
Pyspark读取parquet数据过程解析
Mar 27 Python
详解Python内置模块Collections
Mar 22 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
PHP函数utf8转gb2312编码
2006/12/21 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
python中日期和时间格式化输出的方法小结
2015/03/19 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
介绍一下木马病毒的种类
2015/07/26 面试题
自荐书格式
2013/12/01 职场文书
校园活动策划方案
2014/06/13 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
2015毕业寄语大全
2015/02/26 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
浅谈PHP7中的一些小技巧
2021/05/29 PHP
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python