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和GO语言实现的消息摘要算法示例
Mar 10 Python
Python中实现参数类型检查的简单方法
Apr 21 Python
Python实现线程池代码分享
Jun 21 Python
python实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
python实现微信远程控制电脑
Feb 22 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
python traceback捕获并打印异常的方法
Aug 31 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
Pandas透视表(pivot_table)详解
Jul 22 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 Python
如何在Anaconda中打开python自带idle
Sep 21 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进行MySQL删除记录操作代码
2008/06/07 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
2018/09/21 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
设置python3为默认python的方法
2018/10/31 Python
Python高斯消除矩阵
2019/01/02 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
python圣诞树编写实例详解
2020/02/13 Python
Python学习笔记之装饰器
2020/08/06 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
学年末自我鉴定
2014/01/21 职场文书
教师岗位职责
2015/02/03 职场文书
科技馆观后感
2015/06/08 职场文书
工作建议书范文
2019/07/08 职场文书
Mysql 设置boolean类型的操作
2021/06/04 MySQL
MySQL常见优化方案汇总
2022/01/18 MySQL
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
MySQL 逻辑备份 into outfile
2022/05/15 MySQL
zabbix配置nginx监控的实现
2022/05/25 Servers