这是程序设计中的一种类型推断风格,这种风格适用于动态语言(好比PHP、Python、Ruby、Typescript、Perl、Objective-C、Lua、Julia、JavaScript、Java、Groovy、C#等)和某些静态语言(好比Golang,通常来讲,静态类型语言在编译时便已肯定了变量的类型,可是Golang的实现是:在编译时推断变量的类型),支持"鸭子类型"的语言的解释器/编译器将会在解析(Parse)或编译时,推断对象的类型。编程
这个解释很抽象,又拗口,最讨厌看这些解释了编程语言
其实动态语言是相对静态语言而言的,静态语言的特色是在程序执行前,代码编译时从代码中就能够知道一切,好比变量的类型,方法的返回值类型:测试
String s = "hello"spa
s = "world".net
s = 1// 编译时就会报错设计
在静态语言中,变量有类型信息,它是一块内存区域,静态语言的优势是代码结构很是规范,便于调试,但有时显得啰嗦。调试
而动态语言只有等到程序运行时才知道一切,变量(严格来讲叫名字,就像人的名字同样)不须要指定类型,变量自己没有任何类型信息,类型信息在对象身上,对象是什么类型,必须等到程序运行时才知道,动态类型语言的优势在于方便阅读,不须要写不少类型相关的代码;缺点是不方便调试,命名不规范时会形成读不懂,不利于理解等。对象
s = "hello"blog
s = "world"ip
s = 1# 能够给变量随意赋值,不管是什么类型均可以鸭子类型
动态语言中常常提到鸭子类型,所谓鸭子类型就是:若是走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it must be a duck)。鸭子类型是编程语言中动态类型语言中的一种设计风格,一个对象的特征不是由父类决定,而是经过对象的方法决定的。
#看个例子
这里面
鸭子天然会嘎嘎的叫
小鸟也会叫,这鸟叫声跟鸭子叫声很相似, 哇哇啾啾
小狗也会叫,这狗叫声跟鸭子叫声也很相似,哇哇
既然叫声都很相似,那就认为它们都是鸭子,直接指鸟为鸭,指狗为鸭,
咱们并不关心对象是什么类型,究竟是不是鸭子,只关心行为。
若是你学的是Java或者C++等静态语言,可能对鸭子类型的理解没那么深入,由于静态语言中对象的特性取决于其父类。
而动态语言则不同,好比迭代器,任何实现了 __iter__ 和 __next__ 方法的对象均可称之为迭代器,但对象自己是什么类型不受限制,能够自定义为任何类
鸭子类型依赖文档、清晰的代码和测试来确保正确使用 。这既是优势也是缺点,缺点是须要经过文档才能知道参数类型,为了弥补这方面的不足,Python3.6 引入了类型信息,定义变量的时候能够指定类型
https://www.sohu.com/a/169574908_776230
https://blog.csdn.net/IAlexanderI/article/details/80266300