老生常谈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脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
python下10个简单实例代码
Nov 15 Python
Python装饰器用法实例总结
Feb 07 Python
python opencv 图像尺寸变换方法
Apr 02 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
Python 抓取数据存储到Redis中的操作
Jul 16 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 Python
详解python with 上下文管理器
Sep 02 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
分布式全文检索引擎ElasticSearch原理及使用实例
Nov 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文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
php使用pack处理二进制文件的方法
2014/07/03 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
python中对list去重的多种方法
2014/09/18 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
Python中print和return的作用及区别解析
2019/05/05 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
Java软件工程师综合面试题笔试题
2013/09/08 面试题
信息部岗位职责
2013/11/12 职场文书
上班迟到检讨书
2014/01/10 职场文书
2014教师研修学习体会
2014/07/08 职场文书
升职感谢信
2015/01/22 职场文书
委托收款证明
2015/06/23 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server