老生常谈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深入学习之内存管理
Aug 31 Python
Python实现的ini文件操作类分享
Nov 20 Python
python使用Tkinter显示网络图片的方法
Apr 24 Python
Python中的字符串替换操作示例
Jun 27 Python
python导入时小括号大作用
Jan 10 Python
pycharm 取消默认的右击运行unittest的方法
Nov 29 Python
python里运用私有属性和方法总结
Jul 08 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
python中property属性的介绍及其应用详解
Aug 29 Python
Python操作SQLite数据库过程解析
Sep 02 Python
python中seaborn包常用图形使用详解
Nov 25 Python
python logging通过json文件配置的步骤
Apr 27 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文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
php实现httpRequest的方法
2015/03/13 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
小试JQuery的AutoComplete插件
2011/05/04 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
2015/03/04 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
新闻上下滚动jquery 超简洁(必看篇)
2017/01/21 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
python基础教程之分支、循环简单用法
2016/06/16 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
使用python实现学生信息管理系统
2021/02/25 Python
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
业绩考核岗位职责
2014/02/01 职场文书
党员实事承诺书
2014/03/26 职场文书
作风建设年活动总结
2014/08/27 职场文书
2016年暑期教师培训心得体会
2016/01/09 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL
Python函数对象与闭包函数
2022/04/13 Python