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异常处理总结
Aug 15 Python
python追加元素到列表的方法
Jul 28 Python
详解Python中for循环是如何工作的
Jun 30 Python
对python3 urllib包与http包的使用详解
May 10 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
Django 开发环境配置过程详解
Jul 18 Python
Python 中的 import 机制之实现远程导入模块
Oct 29 Python
TensorFlow2.0矩阵与向量的加减乘实例
Feb 07 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
Python爬虫实例——爬取美团美食数据
Jul 15 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 cookie 登录验证示例代码
2009/03/16 PHP
php中static静态变量的使用方法详解
2010/06/04 PHP
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
英语专业毕业生自荐信范文
2013/12/31 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
先进学校事迹材料
2014/12/30 职场文书
学校食堂管理制度
2015/08/04 职场文书
初中信息技术教学反思
2016/02/16 职场文书
分享几个简单MySQL优化小妙招
2022/03/31 MySQL
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL