对于多态,Python 有更好的实现方式——鸭子类型(duck typing)。 协议和鸭子类型 所谓 鸭子类型 就是:如果一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就是鸭子。...在面向对象编程中,协议是非正式的接口,是一组方法,只由文档和约定定义,因此,协议不能像正式接口那样施加强制性约束。而 Python 的哲学就是尽量支持基本协议。...这样就好理解鸭子类型了,“如果一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子” 这就表示已经遵守了协议,“那么它就是鸭子”,意味着你可以在其他用到“鸭子”的地方,用“这只鸟”替换。...这不就是多态吗? 用“鸭子类型”来实现策略模式也很简单,删掉抽象基类就可以了。(这就是为什么抽象基类很少使用的原因,因为删掉代码也一样正确啊。)有兴趣的小伙伴可以自己尝试一下代码。...Python 中的协议举例 Python 中有很多的协议,比如迭代器协议,任何实现了 __iter__ 和 __next__ 方法的对象都可称之为迭代器,但对象本身是什么类型不受限制,这得益于鸭子类型。
python不支持多态,随着对python理解得加深,对python中得多态又有了一些看法。 首先python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。...这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述: “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”...任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。 鸭子类型通常得益于不测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。...从静态类型语言转向动态类型语言的用户通常试图添加一些静态的(在运行之前的)类型检查,从而影响了鸭子类型的益处和可伸缩性,并约束了语言的动态特性。...,所以可以得到预期的效果(从java角度的预期) e并不是A类型的变量但是根据鸭子类型,走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子,e有pout方法,所以在test方法中e
鸭子类型: 参考鸭子类型,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。...这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述: “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”...在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法。...在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和"叫"方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。...鸭子类型通常得益于"不"测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。 综上:鸭子类型,就是使用了貌似不属于自己的方法(其他函数的方法),自己这个 函数,实例化后会改变本质
首先python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。以下是维基百科中对鸭子类型得论述: 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。...这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述: “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”...在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。...从静态类型语言转向动态类型语言的用户通常试图添加一些静态的(在运行之前的)类型检查,从而影响了鸭子类型的益处和可伸缩性,并约束了语言的动态特性。...,所以可以得到预期的效果(从java角度的预期),e并不是A类型的变量但是根据鸭子类型,走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子,e有prt方法,所以在test方法中e就是一个
在上面的例子里我们并没有限定参数的类型,类似的例子还有: >>> f = lambda x,y:x+y 还记得上面的上面的 lambda 函数吗?不记得的请看Python拓展之特殊函数。...当然了也有人持有相反的观点,认为 Python 不支持多态,理由也是上面的说法。就比如长跑最后的一公里,有的人想就只剩一公里了,也有的人想竟然还有一公里,是一个道理。...鸭子类型 我们在前面所说的,Python 不检查传入的对象的类型,这种方式通俗的被称为「鸭子类型」,比较高端的方式是叫做「隐式类型」或者「结构式类型」。...鸭子类型这个命名源于一句名言: 如果它像鸭子一样走路,像鸭子一样叫,那么它就是一只鸭子。...鸭子类型就意味着可以向任何对象发送任何的消息,语言只关心这个对象能不能接收该消息,不会去强求该对象是否为某一种特定的类型 —— 该对象的多态表现。
,它的类型推断是这样的: 然后在这个 PR 被发布后,类型推断将会变成这样: 这个变化有啥用呢?...我们先来回顾一下我之前的这篇文章:什么是鸭子类型? 鸭子类型 鸭子类型是很多面向对象语言中的常见做法。...它的名字来源于所谓的“鸭子测试”: 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。...我们不用关心鸭子的定义是什么,只要符合我们通常意义上的认知,那么他就是这个物体。 在 TypeScript 中,只要对象符合定义的类型约束,那么我们就可以视为他是。...is 关键字,这在 TypeScript 中被叫做类型谓词(type predicates),类型谓词是一个返回布尔值的函数,可以用来做类型保护; 类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内
如何理解 Golang 中的接口。个人认为,要理解 Go 的接口,一定先了解下鸭子模型。 鸭子模型 那什么鸭子模型?...鸭子模型的解释,通常会用了一个非常有趣的例子,一个东西究竟是不是鸭子,取决于它的能力。游泳起来像鸭子、叫起来也像鸭子,那么就可以是鸭子。...动态语言,比如 Python 和 Javascript 天然支持这种特性,不过相对于静态语言,动态语言的类型缺乏了必要的类型检查。...Go 接口设计和鸭子模型有密切关系,但又和动态语言的鸭子模型有所区别,在编译时,即可实现必要的类型检查。 什么是 Go 接口 Go 接口是一组方法的集合,可以理解为抽象的类型。...Go 中暂时不支持 泛型,不过 Go 2 的方案中似乎将支持泛型。 总结 回答结束,做个简单总结。
鸭子类型(duck typing) 在程序设计中,鸭子类型(duck typing)是动态类型的一种风格。...这个概念的名字来源于由 James Whitcomb Riley 提出的鸭子测试,“鸭子测试”可以这样表述: 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。...在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。 例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭子的对象,并调用它的走和叫方法。...鸭子类型通常得益于不测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。...从静态类型语言转向动态类型语言的用户通常试图添加一些静态的(在运行之前的)类型检查,从而影响了鸭子类型的益处和可伸缩性,并约束了语言的动态特性(Python 文档中有一句:鸭子类型应避免使用 type(
可散列的数据类型 在Python词汇表中,关于可散列类型的定义有这样一段话: “如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__()方法。...:defaultdict和OrderedDict,它们对常见映射方法的支持区别如下: IMG_20210317_125311.png IMG_20210317_125414.png 鸭子类型 鸭子类型是动态语言的说法...,指一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。...如果剩余空间不足,原有的散列表会被复制到一个更大的空间里面。 散列表的键值,又称为散列值,Python中可以用hash()方法来计算所有内置类型对象的散列值。...散列表与dict dict的键必须是可散列的: 支持hash()函数,通过__hash__()得到的散列值是不变的。 支持通过__eq__()来判断是否相等。
什么是鸭子类型 鸭子类型是很多面向对象(OOP)语言中的常见做法。它的名字来源于所谓的“鸭子测试”: 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。...我们不用关心鸭子的定义是什么,只要符合我们通常意义上的认知,那么他就是这个物体。在 TypeScript 中,只要对象符合定义的类型约束,那么我们就可以视为他是。...鸭子类型 通常用于需要处理一系列不同数据的代码中,我们可能不知道调用者要传递哪些参数。在一些 switch 语句或复杂的 if/else 判断中,通常是 鸭子类型 可能派上用场的地方。...所以,我们在处理异常的时必须更加谨慎,所以在 JavaScript 和 TypeScript 中我们要做这样的判断可能有点逆向思维。...小技巧 - 通用类型保护 上面的判断可能在我们的代码中是个很常见的用法,如果我们需要判断的类型有很多,为每个类型都实现一个这样的类型保护函数还挺麻烦的,所以我们可以稍微做个变形来封装一个更通用的类型保护函数
虽说 Python 没有类似 Java 这样的 Interface 特性,但作为面向对象的高级语言也是支持继承的; 在这里我们也可以利用继承的特性来实现面向接口编程: class Car: def...这样在每个子类中就能单独实现业务逻辑,方便扩展和维护。 类型检查 由于 Python 作为一个动态类型语言,无法做到 Java 那样在编译期间校验一个类是否完全实现了某个接口的所有方法。...在 Python 中我们可以利用鸭子类型来优雅的实现面向接口编程。...在这之前先了解下鸭子类型,借用维基百科的说法: “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”...总结 我觉得平时没有接触过动态类型语言的朋友,在了解完这些之后会发现新大陆,就像是 Python 老手第一次使用 Java 时;虽然觉得语法啰嗦,但也会羡慕它的类型检查、参数验证这类特点。
1、什么是“鸭子类型” Python崇尚“鸭子类型” 对于鸭子模型常见的说法是:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”...任何拥有这样的正确的"走"和"叫"方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名 鸭子类型通常得益于"不"测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用...我们传入Person类也一样可以运行,函数并不会检查对象的类型是不是Duck,只要他拥有walk()和swim()方法,就可以正确的被调用 3、小结 在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的...例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法 在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和...,就可以被当成鸭子类型了 鸭子类型的好处就在于能够避免一些类的重写,无需大量复制相同的代码 鸭子类型使用的前提是需要良好的文档支持,不然会让代码变得很混乱,如果没有良好的文档及说明,有可能会导致你的
类是模板,对象是根据类这个模板创建出来的,先有类,再有对象 类只有一个,对象有多个 类中定义的方法属性都会存在对象中,不多不少 不同的对象之间的属性不尽相同 No.2 类的创建 方法名 类型 作用 new...>D-C->E-F No.5 多态 Python中不支持多态,也不用支持多态,Python是一种多态语言,崇尚鸭子类型,鸭子类型的概念来自于:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,...那么这只鸟就可以被称为鸭子,Python不会检查类型是不是鸭子,只要它拥有鸭子的特征,就可以被正确的调用 class Duck: def speak(self): print(...__age) # AttributeError: 'User' object has no attribute '__age' 好吧,私有属性不让我访问,但是真的无法访问吗 print(u...._User__age=20 # 当然,设置也可以这样 u.get_age() # 20 No.9 单例模式 new方法 使用类名()创建对象,首先会调用new方法为对象分配空间,它的主要作用就是在内存中为对象分配空间和返回对象的引用
图中的红框像闪电一样从你的脑子里划过。你用中指扶了扶黑框眼镜,自信地说道: 鸭子类型就是说,一个函数不会关心它传入参数的类型,只关心这个参数对应的对象有没有自己想要的方法和属性。如果有,就能运行。...这就像是我看到了一只鸟,只要它能像鸭子一样叫,像鸭子一样走路,有鸭子一样的白色羽毛,那么,无论它实际上是什么东西,我都认为它是鸭子。 说完这段话,一道光从你的镜片上一闪而过。你心里想,这下稳了。...鸭子类型是像int、string、map这样内置的类型吗?我们可以在 Golang 里面使用var a string 声明一个类型为string的变量,那请问怎么声明一个类型为鸭子的变量?...当他把鸭子类型和整型、字符串类型合在一起说的时候,让你觉得鸭子类型也是一种类型。但实际上鸭子类型并不是一种类型,鸭子类型是一种动态类型的风格: ? 怎么解释什么叫做设计风格呢?...def check(animal): animal.eat() 在鸭子类型这种设计风格中,开发者不关心对象是什么类型。它只关心对象有没有特定的方法。
原因很多,最主要的是Promise值可能是从其他浏览器窗口(iframe等)接收到的。这个浏览器窗口自己的Promise可能和当前窗口/frame的不同,所以这样的检查是无法识别Promise实例的。...比较好的识别方法是通过鸭子类型检查来判断是否为Promise值。即根据一个值的形态(具有哪些属性)对这个值的类型做出一些假定。...所谓的鸭子类型,就是“如果它看起来像只鸭子,叫起来像只鸭子,那它一定就是鸭子。”...所以对thenable值的鸭子类型检查就大致类似于这样实现: // promise对象的鸭子类型判断 function promiseDuckCheck(p) { if( p!...如果在链式调用中,有地方报错就执行reject()抛出错误,并由最后的catch()统一捕获。 在实际开发中,可以像这样通过promise构造ajax链式进行异步流调用。
image.png #思特沃克好声音# (图片:网络) 在动态语言的世界里一直流传着一种叫做鸭子类型的风格,其来自谚语:“如果行鸭子一样走路,像鸭子一样呱呱叫,那它就是一只鸭子”。 ...在动态语言设计中,可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型的实例,而不在于它是否显示的实现或者继承。 鸭子类型在动态语言中被广为奉行。...但是相对于java这类静态强类型语言而言是将语法的检查推向了运行时期,延迟了发现问题的时间,不助于我们的调试。...(I).Get() } Go语言不同于其他鸭子类型语言的是它实现了在编译时期检查,同时也不失这种自由度。 ...他为javascript引入的接口,类型,泛型等较完备的类型系统,是的能够有更好的IDE支持,从某种程度上来说,这是对鸭子类型或者javascript编译器的检查推迟的弥补。
原文链接: Go 专栏|接口 interface Duck Typing,鸭子类型,在维基百科里是这样定义的: If it looks like a duck, swims like a duck, and...翻译过来就是:如果某个东西长得像鸭子,游泳像鸭子,嘎嘎叫像鸭子,那它就可以被看成是一只鸭子。 它是动态编程语言的一种对象推断策略,它更关注对象能做什么,而不是对象的类型本身。...例如:在动态语言 Python 中,定义一个这样的函数: def hello_world(duck): duck.say_hello() 当调用此函数的时候,可以传入任意类型,只要它实现了 say_hello...Go 语言作为一门静态语言,它通过接口的方式完美支持鸭子类型。 接口类型 之前介绍的类型都是具体类型,而接口是一种抽象类型,是多个方法声明的集合。...在 Go 中,只要目标类型实现了接口要求的所有方法,我们就说它实现了这个接口。
添加了类型系统,并提供了强大的类型检查和自动补全功能。...鸭子类型的概念来自一个古老的英语成语:“如果它走起路来像一只鸭子,叫起来也像一只鸭子,那么它就是一只鸭子。”...本文将全面深入地探讨 TypeScript 中的鸭子类型,以及如何在实际的开发中应用和利用鸭子类型。 1....鸭子类型:定义和示例 鸭子类型的概念来自一个古老的英语成语:“如果它走起路来像一只鸭子,叫起来也像一只鸭子,那么它就是一只鸭子。”...因为 TypeScript 的类型检查器只检查对象是否满足接口的结构,而不检查对象是否真的是接口所期望的类型。
所以在说 interface 和 any 的时候, 其实说的是相同的东西。 interface 的使用场景到处都是。还记得我们之前说的 JSON 和 YAML 的配置文件处理吗?...鸭式对象 先来说说 鸭式对象: 叫的像鸭子, 走路像鸭子, 那它就是鸭子。 我们对鸭子下一个定义, 1. 发出嘎嘎的叫声, 2....走路一摇一摆, 然后规定 任何满足这两个条件的 都是鸭子 我们拿着定义去对比。 有一个 人 是演员, 他能模仿鸭子发出嘎嘎声, 也能模仿鸭子一摇一摆的走路。那么, 这个人能被认为是鸭子。...在上面描述中, 已经提到了接口的两个重要概念:定义 与 实现。...并且满足之前人和动物的接口。 接口检查 在书写代码的过程中, 要检查一个结构对象是否完全 实现了接口对应的所有方法, 避免在运行调用的时候才发现。
TS中的接口(interface) ---- TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。...鸭式辨型:像鸭子一样走路、游泳和嘎嘎叫的鸟就是鸭子 对象接口 目标:定义一个鸭子的标准,检查什么是鸭子 1、鸭子在鸟的基础上有其他特征,先定义一个鸟的接口: interface Bird{...,定义鸭子接口 interface Duck extends Bird{ //嘎嘎叫 call:"gagaga" //会游泳 swim:true //走路像鸭子...runLike:"duck" } 3、 检查鸡是不是鸭子类型 ?...它不会帮你检查类是否具有某些私有成员。 类静态部分与实例部分的区别 构造函数属于静态部分,无法进行类型检查。 这里因为当一个类实现了一个接口时,只对其实例部分进行类型检查。
领取专属 10元无门槛券
手把手带您无忧上云