老生常谈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标准库之循环器(itertools)介绍
Nov 25 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
Jun 14 Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
Feb 21 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
python range实例用法分享
Feb 06 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
Python OpenCV中的numpy与图像类型转换操作
Dec 11 Python
Python爬虫新手入门之初学lxml库
Dec 20 Python
用Python实现Newton插值法
Apr 17 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 Try Catch异常测试
2009/03/01 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
Extjs中常用表单介绍与应用
2010/06/07 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
详解JavaScript之Array.reduce源码解读
2020/11/01 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
python入门教程之基本算术运算符
2020/11/13 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
女娲补天教学反思
2014/02/05 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
办公用品管理制度
2015/08/04 职场文书
2016年寒假家长评语
2015/10/10 职场文书
Redis实现分布式锁的五种方法详解
2022/06/14 Redis