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下如何让web元素的生成更简单的分析
Jul 17 Python
Python实现多并发访问网站功能示例
Jun 19 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
python flask web服务实现更换默认端口和IP的方法
Jul 26 Python
python图形用户接口实例详解
Dec 16 Python
pyinstaller还原python代码过程图解
Jan 08 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
Apr 23 Python
Python OpenCV读取中文路径图像的方法
Jul 02 Python
opencv 图像轮廓的实现示例
Jul 08 Python
python实现简单的聊天小程序
Jul 07 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实现图片上传并进行替换操作
2016/03/15 PHP
PHP中phar包的使用教程
2017/06/14 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
vue axios用法教程详解
2017/07/23 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
python共享引用(多个变量引用)示例代码
2013/12/04 Python
浅析Python中的join()方法的使用
2015/05/19 Python
python中的格式化输出用法总结
2016/07/28 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
python代码区分大小写吗
2020/06/17 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
销售主管岗位职责
2014/02/08 职场文书
珍惜水资源建议书
2014/03/12 职场文书
学术会议邀请函
2015/01/30 职场文书
本溪关门山导游词
2015/02/09 职场文书
中秋节慰问信
2015/02/15 职场文书
驻村工作简报
2015/07/20 职场文书
高中信息技术教学反思
2016/02/16 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
HTML+JS实现在线朗读器
2022/02/15 Javascript