老生常谈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写入已存在的excel数据实例
May 03 Python
Django组件之cookie与session的使用方法
Jan 10 Python
python把转列表为集合的方法
Jun 28 Python
python字符串Intern机制详解
Jul 01 Python
Django框架视图介绍与使用详解
Jul 18 Python
Flask框架模板继承实现方法分析
Jul 31 Python
Python 点击指定位置验证码破解的实现代码
Sep 11 Python
python实现网站微信登录的示例代码
Sep 18 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
python中可以声明变量类型吗
Jun 18 Python
python三引号如何输入
Jul 06 Python
Python paramiko使用方法代码汇总
Nov 20 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
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
php目录遍历函数opendir用法实例
2014/11/20 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
vue cli升级webapck4总结
2018/04/04 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
jQuery实现本地存储
2020/12/22 jQuery
python数字图像处理之高级滤波代码详解
2017/11/23 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
教师评优事迹材料
2014/01/10 职场文书
求职意向书
2014/07/29 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
卖车协议书范例
2014/09/16 职场文书
社区安全温馨提示语
2015/07/14 职场文书
2016银行求职自荐信
2016/01/28 职场文书
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python
详解jQuery的核心函数和事件处理
2022/02/18 jQuery