老生常谈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类的定义、继承及类对象使用方法简明教程
May 08 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
Python时间戳使用和相互转换详解
Dec 11 Python
Python读取word文本操作详解
Jan 22 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
python创建文件时去掉非法字符的方法
Oct 31 Python
python使用Plotly绘图工具绘制柱状图
Apr 01 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
python实现输入三角形边长自动作图求面积案例
Apr 12 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
python能否java成为主流语言吗
Jun 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
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
JavaScript使用cookie实现记住账号密码功能
2015/04/27 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
Python continue语句用法实例
2014/03/11 Python
python简单猜数游戏实例
2015/07/09 Python
Python subprocess模块常见用法分析
2018/06/12 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python3安装speech语音模块的方法
2018/12/24 Python
python字典一键多值实例代码分享
2019/06/14 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
python else语句在循环中的运用详解
2020/07/06 Python
Python之多进程与多线程的使用
2021/02/23 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
应届生人事助理求职信
2013/11/09 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
春节联欢晚会主持词
2014/03/24 职场文书
幽灵公主观后感
2015/06/09 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
mysql left join快速转inner join的过程
2021/06/30 MySQL
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android