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程序来判断文本的语种
Apr 07 Python
Python匹配中文的正则表达式
May 11 Python
python中使用zip函数出现错误的原因
Sep 28 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
python实现中文文本分句的例子
Jul 15 Python
Django REST framework内置路由用法
Jul 26 Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
python next()和iter()函数原理解析
Feb 07 Python
Tensorflow: 从checkpoint文件中读取tensor方式
Feb 10 Python
python 数据库查询返回list或tuple实例
May 15 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文件读写操作之文件写入代码
2011/01/13 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
python通过floor函数舍弃小数位的方法
2015/03/17 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
Python列表与元组的异同详解
2019/07/02 Python
Python文件路径名的操作方法
2019/10/30 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
UNIX特点都有哪些
2016/04/05 面试题
元旦寄语大全
2014/04/10 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
工会主席事迹材料
2014/06/03 职场文书
个人简历求职信范文
2015/03/20 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
python 如何执行控制台命令与操作剪切板
2021/05/20 Python
Oracle表空间与权限的深入讲解
2021/11/17 Oracle