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 相关文章推荐
python命令行参数sys.argv使用示例
Jan 28 Python
从零学Python之入门(五)缩进和选择
May 27 Python
浅谈python中列表、字符串、字典的常用操作
Sep 19 Python
python导出hive数据表的schema实例代码
Jan 22 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
python使用turtle绘制分形树
Jun 22 Python
Django框架模板介绍
Jan 15 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
Oct 22 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
Python实现登录接口的示例代码
2017/07/21 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
Python持续监听文件变化代码实例
2020/07/22 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
上课玩手机检讨书
2014/02/08 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
2014年项目工作总结
2014/11/24 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python