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 22 Python
在Python下使用Txt2Html实现网页过滤代理的教程
Apr 11 Python
Python算法应用实战之队列详解
Feb 04 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
python删除本地夹里重复文件的方法
Nov 19 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
python实现密度聚类(模板代码+sklearn代码)
Apr 27 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
python制作微博图片爬取工具
Jan 16 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中实现获取随机数组列表的自定义函数
2015/04/02 PHP
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
js轮播图代码分享
2016/07/14 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
Python猜数字算法题详解
2020/03/01 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
为什么称python为胶水语言
2020/06/16 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
《故乡》教学反思
2014/04/10 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
php 原生分页
2021/04/01 PHP
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
SQL Server中的游标介绍
2022/05/20 SQL Server
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python