老生常谈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使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
详解Python字符串对象的实现
Dec 24 Python
Python调用C++程序的方法详解
Jan 24 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
Python实现的列表排序、反转操作示例
Mar 13 Python
使用python实现ftp的文件读写方法
Jul 02 Python
python 实现矩阵填充0的例子
Nov 29 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
python如何实现word批量转HTML
Sep 30 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
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
php实现的操作excel类详解
2016/01/15 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
在Python中使用元类的教程
2015/04/28 Python
编写Python的web框架中的Model的教程
2015/04/29 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Python使用python-docx读写word文档
2019/08/26 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
最新党员的自我评价分享
2013/11/04 职场文书
高级技校毕业生自荐信
2013/11/18 职场文书
高校教师个人总结
2015/02/10 职场文书
学期个人工作总结
2015/02/13 职场文书
老乡聚会通知
2015/04/23 职场文书
承诺书范本大全
2015/05/04 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL