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与js)两种实现
Feb 21 Python
python处理文本文件并生成指定格式的文件
Jul 31 Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 Python
python字符串对其居中显示的方法
Jul 11 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
20行python代码的入门级小游戏的详解
May 05 Python
Python第三方库的几种安装方式(小结)
Apr 03 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
May 09 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 Python
Django nginx配置实现过程详解
Sep 10 Python
Python爬取梨视频的示例
Jan 29 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魔术引号所带来的安全问题分析
2014/07/15 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
python中将字典转换成其json字符串
2014/07/16 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
python 自动重连wifi windows的方法
2018/12/18 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
预备党员入党思想汇报
2014/01/04 职场文书
交通事故协议书范文
2014/10/23 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
教师求职信怎么写
2015/03/20 职场文书
Python实现位图分割的效果
2021/11/20 Python
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
Python保存并浏览用户的历史记录
2022/04/29 Python
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers