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中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
Python闭包实现计数器的方法
May 05 Python
python实现查找两个字符串中相同字符并输出的方法
Jul 11 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
Python中将字典转换为列表的方法
Sep 21 Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 Python
python实现QQ批量登录功能
Jun 19 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
python 实现IP子网计算
Feb 18 Python
安装不同版本的tensorflow与models方法实现
Feb 20 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/12/30 PHP
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
javascript实用方法总结
2015/02/06 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
js实现漫天星星效果
2017/01/19 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
简介Django中内置的一些中间件
2015/07/24 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
pandas分批读取大数据集教程
2020/06/06 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
我的中国梦演讲稿1000字
2014/08/19 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
2019辞职报告范本3篇!
2019/07/23 职场文书
golang中的空slice案例
2021/04/27 Golang