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实现的多线程端口扫描工具分享
Jan 21 Python
Python深入06——python的内存管理详解
Dec 07 Python
Python 忽略warning的输出方法
Oct 18 Python
Python3实现腾讯云OCR识别
Nov 27 Python
PYQT5实现控制台显示功能的方法
Jun 25 Python
python3实现mysql导出excel的方法
Jul 31 Python
详解如何减少python内存的消耗
Aug 09 Python
使用python实现对元素的长截图功能
Nov 14 Python
python中seaborn包常用图形使用详解
Nov 25 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
Django接收照片储存文件的实例代码
Mar 07 Python
Python3.9.1中使用match方法详解
Feb 08 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新手上路(十四)
2006/10/09 PHP
PHP开发中常用的字符串操作函数
2011/02/08 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
TopList标签和JavaScript结合两例
2007/08/12 Javascript
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
理解javascript中的闭包
2017/01/11 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
python3下载抖音视频的完整代码
2019/06/05 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
《湘夫人》教学反思
2014/02/21 职场文书
高三学习决心书
2014/03/11 职场文书
春节超市活动方案
2014/08/14 职场文书
语文课外活动总结
2014/08/27 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
安全先进班组材料
2014/12/26 职场文书
送给客户微信问候语!
2019/07/04 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏