Python动态语言与鸭子类型详解


Posted in Python onJuly 01, 2019

今天来说说编程语言中的动态类型语言与鸭子类型。

动态语言

维基百科对动态语言的定义:

动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力如PHP、Ruby、Python 都属于动态语言,而C、C++、Java等语言则不属于动态语言。

这个解释很抽象,其实动态语言是相对静态语言而言的,静态语言的特点是在程序执行前,代码编译时从代码中就可以知道一切,比如变量的类型,方法的返回值类型:

String s = "hello"
s = "world"
s = 1 // 编译时就会报错

在静态语言中,变量有类型信息,它是一块内存区域,静态语言的优点是代码结构非常规范,便于调试,但有时显得??隆6???镅灾挥械鹊匠绦蛟诵惺辈胖?酪磺校?淞浚ㄑ细窭此到忻?郑?拖袢说拿?忠谎?┎恍枰?付ɡ嘈停?淞勘旧砻挥腥魏卫嘈托畔ⅲ?嘈托畔⒃诙韵笊砩希?韵笫鞘裁蠢嘈停?匦氲鹊匠绦蛟诵惺辈胖?溃???嘈陀镅缘挠诺阍谟诜奖阍亩粒?恍枰?春芏嗬嘈拖喙氐拇?耄蝗钡闶遣环奖愕魇裕???还娣妒被嵩斐啥敛欢??焕?诶斫獾取?/p>

s = "hello"
s = "world"
s = 1 # 可以给变量随意赋值,无论是什么类型都可以

鸭子类型

动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it must be a duck)。鸭子类型是编程语言中动态类型语言中的一种设计风格,一个对象的特征不是由父类决定,而是通过对象的方法决定的。

如果你学的是Java或者C++等静态语言,可能对鸭子类型的理解没那么深刻,因为静态语言中对象的特性取决于其父类。而动态语言则不一样,比如迭代器,任何实现了 __iter__ 和 __next__方法的对象都可称之为迭代器,但对象本身是什么类型不受限制,可以自定义为任何类

# python3
class Foo:
def __iter__(self):
pass
def __next__(self):
pass
from collections import Iterable
from collections import Iterator
print(isinstance(Foo(), Iterable)) # True
print(isinstance(Foo(), Iterator)) # True

我们并不需要继承 Iterator 就可以实现迭代器的功能。当有一函数希望接收的参数是 Iterator 类型时,但是我们传递的是 Foo 的实例对象,其实也没问题,换成是Java等静态语言,就必须传递 Iterator或者是它的子类。鸭子类型通常得益于"不"测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用,这既是优点也是缺点,缺点是需要通过文档才能知道参数类型,为了弥补这方面的不足,Python3.6引入了类型信息,定义变量的时候可以指定类型,例如:

def greeting(name: str) -> str:
return 'Hello ' + name

该函数表示接收str类型的参数,并返回str类型的值

Python 相关文章推荐
Django发送html邮件的方法
May 26 Python
Python 备份程序代码实现
Mar 06 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
django 多数据库配置教程
May 30 Python
基于python if 判断选择结构的实例详解
May 06 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
python数据预处理 :数据共线性处理详解
Feb 24 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
Django用户登录与注册系统的实现示例
Jun 03 Python
matplotlib绘制多子图共享鼠标光标的方法示例
Jan 08 Python
Python制作春联的示例代码
Jan 22 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 #Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 #Python
python字符串Intern机制详解
Jul 01 #Python
简单了解python单例模式的几种写法
Jul 01 #Python
python如何获取列表中每个元素的下标位置
Jul 01 #Python
Django自定义用户登录认证示例代码
Jun 30 #Python
Python中栈、队列与优先级队列的实现方法
Jun 30 #Python
You might like
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
JS之小练习代码
2008/10/12 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
2015/03/13 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
JS判断时间段的实现代码
2017/06/14 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
js实现继承的方法及优缺点总结
2019/05/08 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
幼儿教师自我鉴定
2013/11/02 职场文书
2014的自我评价
2014/01/13 职场文书
毕业留言寄语大全
2014/04/10 职场文书
中药学专业求职信
2014/05/31 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书