首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python:多态、协议和鸭子类型

对于多态,Python 有更好实现方式——鸭子类型(duck typing)。 协议和鸭子类型 所谓 鸭子类型 就是:如果一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么它就是鸭子。...在面向对象编程,协议是非正式接口,是一组方法,只由文档和约定定义,因此,协议不能正式接口那样施加强制性约束。而 Python 哲学就是尽量支持基本协议。...这样就好理解鸭子类型了,“如果一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子” 这就表示已经遵守了协议,“那么它就是鸭子”,意味着你可以在其他用到“鸭子地方,用“这只鸟”替换。...这不就是多态? 用“鸭子类型”来实现策略模式也很简单,删掉抽象基类就可以了。(这就是为什么抽象基类很少使用原因,因为删掉代码也一样正确啊。)有兴趣小伙伴可以自己尝试一下代码。...Python 协议举例 Python 中有很多协议,比如迭代器协议,任何实现了 __iter__ 和 __next__ 方法对象都可称之为迭代器,但对象本身是什么类型不受限制,这得益于鸭子类型

98520

Python 学习入门(30)—— 多态

python不支持多态,随着对python理解得加深,对python得多态又有了一些看法。 首先python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。...这个概念名字来源于由James Whitcomb Riley提出鸭子测试,“鸭子测试”可以这样表述: “当看到一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子。”...任何拥有这样正确走和叫方法对象都可被函数接受这种行为引出了以上表述,这种决定类型方式因此得名。 鸭子类型通常得益于不测试方法和函数参数类型,而是依赖文档、清晰代码和测试来确保正确使用。...从静态类型语言转向动态类型语言用户通常试图添加一些静态(在运行之前类型检查,从而影响了鸭子类型益处和可伸缩性,并约束了语言动态特性。...,所以可以得到预期效果(从java角度预期) e并不是A类型变量但是根据鸭子类型,走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子,e有pout方法,所以在test方法e

42410
您找到你想要的搜索结果了吗?
是的
没有找到

python 多态理解

鸭子类型: 参考鸭子类型鸭子类型(英语:duck typing)是动态类型一种风格。在这种风格,一个对象有效语义,不是由继承自特定类或实现特定接口,而是由"当前方法和属性集合"决定。...这个概念名字来源于由James Whitcomb Riley提出鸭子测试,“鸭子测试”可以这样表述: “当看到一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子。”...在鸭子类型,关注不是对象类型本身,而是它是如何使用。例如,在不使用鸭子类型语言中,我们可以编写一个函数,它接受一个类型为"鸭子"对象,并调用它"走"和"叫"方法。...在使用鸭子类型语言中,这样一个函数可以接受一个任意类型对象,并调用它"走"和"叫"方法。如果这些需要被调用方法不存在,那么将引发一个运行时错误。...鸭子类型通常得益于"不"测试方法和函数参数类型,而是依赖文档、清晰代码和测试来确保正确使用。 综上:鸭子类型,就是使用了貌似不属于自己方法(其他函数方法),自己这个 函数,实例化后会改变本质

68420

再谈python多态

首先python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。以下是维基百科鸭子类型得论述: 在程序设计鸭子类型(英语:duck typing)是动态类型一种风格。...这个概念名字来源于由James Whitcomb Riley提出鸭子测试,“鸭子测试”可以这样表述: “当看到一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子。”...在使用鸭子类型语言中,这样一个函数可以接受一个任意类型对象,并调用它走和叫方法。如果这些需要被调用方法不存在,那么将引发一个运行时错误。...从静态类型语言转向动态类型语言用户通常试图添加一些静态(在运行之前类型检查,从而影响了鸭子类型益处和可伸缩性,并约束了语言动态特性。...,所以可以得到预期效果(从java角度预期),e并不是A类型变量但是根据鸭子类型,走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子,e有prt方法,所以在test方法e就是一个

1.2K10

零基础学习 Python 之多态

在上面的例子里我们并没有限定参数类型,类似的例子还有: >>> f = lambda x,y:x+y 还记得上面的上面的 lambda 函数?不记得请看Python拓展之特殊函数。...当然了也有人持有相反观点,认为 Python 不支持多态,理由也是上面的说法。就比如长跑最后一公里,有的人想就只剩一公里了,也有的人想竟然还有一公里,是一个道理。...鸭子类型 我们在前面所说,Python 不检查传入对象类型,这种方式通俗被称为「鸭子类型」,比较高端方式是叫做「隐式类型」或者「结构式类型」。...鸭子类型这个命名源于一句名言: 如果它鸭子一样走路,鸭子一样叫,那么它就是一只鸭子。...鸭子类型就意味着可以向任何对象发送任何消息,语言只关心这个对象能不能接收该消息,不会去强求该对象是否为某一种特定类型 —— 该对象多态表现。

34510

TypeScript 5.5 ,即将支持自动推断类型守卫!

,它类型推断是这样: 然后在这个 PR 被发布后,类型推断将会变成这样: 这个变化有啥用呢?...我们先来回顾一下我之前这篇文章:什么是鸭子类型鸭子类型 鸭子类型是很多面向对象语言中常见做法。...它名字来源于所谓鸭子测试”: 当看到一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子。...我们不用关心鸭子定义是什么,只要符合我们通常意义上认知,那么他就是这个物体。 在 TypeScript ,只要对象符合定义类型约束,那么我们就可以视为他是。...is 关键字,这在 TypeScript 中被叫做类型谓词(type predicates),类型谓词是一个返回布尔值函数,可以用来做类型保护; 类型保护是可执行运行时检查一种表达式,用于确保该类型在一定范围内

15410

Go 问答之如何理解 Go 接口

如何理解 Golang 接口。个人认为,要理解 Go 接口,一定先了解下鸭子模型。 鸭子模型 那什么鸭子模型?...鸭子模型解释,通常会用了一个非常有趣例子,一个东西究竟是不是鸭子,取决于它能力。游泳起来鸭子、叫起来也鸭子,那么就可以是鸭子。...动态语言,比如 Python 和 Javascript 天然支持这种特性,不过相对于静态语言,动态语言类型缺乏了必要类型检查。...Go 接口设计和鸭子模型有密切关系,但又和动态语言鸭子模型有所区别,在编译时,即可实现必要类型检查。 什么是 Go 接口 Go 接口是一组方法集合,可以理解为抽象类型。...Go 暂时不支持 泛型,不过 Go 2 方案似乎将支持泛型。 总结 回答结束,做个简单总结。

54231

鸭子类型

鸭子类型(duck typing) 在程序设计鸭子类型(duck typing)是动态类型一种风格。...这个概念名字来源于由 James Whitcomb Riley 提出鸭子测试,“鸭子测试”可以这样表述: 当看到一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子。...在鸭子类型,关注不是对象类型本身,而是它是如何使用。 例如,在不使用鸭子类型语言中,我们可以编写一个函数,它接受一个类型鸭子对象,并调用它走和叫方法。...鸭子类型通常得益于不测试方法和函数参数类型,而是依赖文档、清晰代码和测试来确保正确使用。...从静态类型语言转向动态类型语言用户通常试图添加一些静态(在运行之前类型检查,从而影响了鸭子类型益处和可伸缩性,并约束了语言动态特性(Python 文档中有一句:鸭子类型应避免使用 type(

55241

深度剖析Python字典和集合

可散列数据类型 在Python词汇表,关于可散列类型定义有这样一段话: “如果一个对象是可散列,那么在这个对象生命周期中,它散列值是不变,而且这个对象需要实现__hash__()方法。...:defaultdict和OrderedDict,它们对常见映射方法支持区别如下: IMG_20210317_125311.png IMG_20210317_125414.png 鸭子类型 鸭子类型是动态语言说法...,指一个对象只要“看起来鸭子,走起路来鸭子”,那它就可以被看做是鸭子。...如果剩余空间不足,原有的散列表会被复制到一个更大空间里面。 散列表键值,又称为散列值,Python可以用hash()方法来计算所有内置类型对象散列值。...散列表与dict dict键必须是可散列支持hash()函数,通过__hash__()得到散列值是不变支持通过__eq__()来判断是否相等。

1.6K00

什么是鸭子🦆类型

什么是鸭子类型 鸭子类型是很多面向对象(OOP)语言中常见做法。它名字来源于所谓鸭子测试”: 当看到一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子。...我们不用关心鸭子定义是什么,只要符合我们通常意义上认知,那么他就是这个物体。在 TypeScript ,只要对象符合定义类型约束,那么我们就可以视为他是。...鸭子类型 通常用于需要处理一系列不同数据代码,我们可能不知道调用者要传递哪些参数。在一些 switch 语句或复杂 if/else 判断,通常是 鸭子类型 可能派上用场地方。...所以,我们在处理异常时必须更加谨慎,所以在 JavaScript 和 TypeScript 我们要做这样判断可能有点逆向思维。...小技巧 - 通用类型保护 上面的判断可能在我们代码是个很常见用法,如果我们需要判断类型有很多,为每个类型都实现一个这样类型保护函数还挺麻烦,所以我们可以稍微做个变形来封装一个更通用类型保护函数

1.9K20

Python 面向接口编程

虽说 Python 没有类似 Java 这样 Interface 特性,但作为面向对象高级语言也是支持继承; 在这里我们也可以利用继承特性来实现面向接口编程: class Car: def...这样在每个子类中就能单独实现业务逻辑,方便扩展和维护。 类型检查 由于 Python 作为一个动态类型语言,无法做到 Java 那样在编译期间校验一个类是否完全实现了某个接口所有方法。...在 Python 我们可以利用鸭子类型来优雅实现面向接口编程。...在这之前先了解下鸭子类型,借用维基百科说法: “当看到一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子。”...总结 我觉得平时没有接触过动态类型语言朋友,在了解完这些之后会发现新大陆,就像是 Python 老手第一次使用 Java 时;虽然觉得语法啰嗦,但也会羡慕它类型检查、参数验证这类特点。

64530

浅谈Python鸭子类型

1、什么是“鸭子类型” Python崇尚“鸭子类型” 对于鸭子模型常见说法是:“当看到一只鸟走起来鸭子、游泳起来鸭子、叫起来也鸭子,那么这只鸟就可以被称为鸭子。”...任何拥有这样正确"走"和"叫"方法对象都可被函数接受这种行为引出了以上表述,这种决定类型方式因此得名 鸭子类型通常得益于"不"测试方法和函数参数类型,而是依赖文档、清晰代码和测试来确保正确使用...我们传入Person类也一样可以运行,函数并不会检查对象类型是不是Duck,只要他拥有walk()和swim()方法,就可以正确被调用 3、小结 在鸭子类型,关注不是对象类型本身,而是它是如何使用...例如,在不使用鸭子类型语言中,我们可以编写一个函数,它接受一个类型为"鸭子"对象,并调用它"走"和"叫"方法 在使用鸭子类型语言中,这样一个函数可以接受一个任意类型对象,并调用它"走"和...,就可以被当成鸭子类型鸭子类型好处就在于能够避免一些类重写,无需大量复制相同代码 鸭子类型使用前提是需要良好文档支持,不然会让代码变得很混乱,如果没有良好文档及说明,有可能会导致你

2.3K20

Python全栈开发之面向对象

类是模板,对象是根据类这个模板创建出来,先有类,再有对象 类只有一个,对象有多个 类定义方法属性都会存在对象,不多不少 不同对象之间属性不尽相同 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方法为对象分配空间,它主要作用就是在内存为对象分配空间和返回对象引用

46710

面试扣分点:什么是鸭子类型

图中红框闪电一样从你脑子里划过。你用中指扶了扶黑框眼镜,自信地说道: 鸭子类型就是说,一个函数不会关心它传入参数类型,只关心这个参数对应对象有没有自己想要方法和属性。如果有,就能运行。...这就像是我看到了一只鸟,只要它能鸭子一样叫,鸭子一样走路,有鸭子一样白色羽毛,那么,无论它实际上是什么东西,我都认为它是鸭子。 说完这段话,一道光从你镜片上一闪而过。你心里想,这下稳了。...鸭子类型int、string、map这样内置类型?我们可以在 Golang 里面使用var a string 声明一个类型为string变量,那请问怎么声明一个类型鸭子变量?...当他把鸭子类型和整型、字符串类型合在一起说时候,让你觉得鸭子类型也是一种类型。但实际上鸭子类型并不是一种类型鸭子类型是一种动态类型风格: ? 怎么解释什么叫做设计风格呢?...def check(animal): animal.eat() 在鸭子类型这种设计风格,开发者不关心对象是什么类型。它只关心对象有没有特定方法。

74340

《你不知道JavaScript》:深入Promise链式调用

原因很多,最主要是Promise值可能是从其他浏览器窗口(iframe等)接收到。这个浏览器窗口自己Promise可能和当前窗口/frame不同,所以这样检查是无法识别Promise实例。...比较好识别方法是通过鸭子类型检查来判断是否为Promise值。即根据一个值形态(具有哪些属性)对这个值类型做出一些假定。...所谓鸭子类型,就是“如果它看起来鸭子,叫起来鸭子,那它一定就是鸭子。”...所以对thenable值鸭子类型检查就大致类似于这样实现: // promise对象鸭子类型判断 function promiseDuckCheck(p) { if( p!...如果在链式调用,有地方报错就执行reject()抛出错误,并由最后catch()统一捕获。 在实际开发,可以这样通过promise构造ajax链式进行异步流调用。

73740

语言设计鸭子类型风格

image.png #思特沃克好声音# (图片:网络) 在动态语言世界里一直流传着一种叫做鸭子类型风格,其来自谚语:“如果行鸭子一样走路,鸭子一样呱呱叫,那它就是一只鸭子”。     ...在动态语言设计,可以解释为无论一个对象是什么类型,只要它具有某类型行为(方法),则它就是这一类型实例,而不在于它是否显示实现或者继承。      鸭子类型在动态语言中被广为奉行。...但是相对于java这类静态强类型语言而言是将语法检查推向了运行时期,延迟了发现问题时间,不助于我们调试。...(I).Get() }    Go语言不同于其他鸭子类型语言是它实现了在编译时期检查,同时也不失这种自由度。    ...他为javascript引入接口,类型,泛型等较完备类型系统,是的能够有更好IDE支持,从某种程度上来说,这是对鸭子类型或者javascript编译器检查推迟弥补。

78570

Go 专栏|接口 interface

原文链接: 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 ,只要目标类型实现了接口要求所有方法,我们就说它实现了这个接口。

34400

「Go」接口 interface: 一个案例说清用法和注意

所以在说 interface 和 any 时候, 其实说是相同东西。 interface 使用场景到处都是。还记得我们之前说 JSON 和 YAML 配置文件处理?...鸭式对象 先来说说 鸭式对象: 叫鸭子, 走路鸭子, 那它就是鸭子。 我们对鸭子下一个定义, 1. 发出嘎嘎叫声, 2....走路一摇一摆, 然后规定 任何满足这两个条件 都是鸭子 我们拿着定义去对比。 有一个 人 是演员, 他能模仿鸭子发出嘎嘎声, 也能模仿鸭子一摇一摆走路。那么, 这个人能被认为是鸭子。...在上面描述, 已经提到了接口两个重要概念:定义 与 实现。...并且满足之前人和动物接口。 接口检查 在书写代码过程, 要检查一个结构对象是否完全 实现了接口对应所有方法, 避免在运行调用时候才发现。

47310

TypeScript系列教程七《接口》

TS接口(interface) ---- TypeScript核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。...鸭式辨型:鸭子一样走路、游泳和嘎嘎叫鸟就是鸭子 对象接口 目标:定义一个鸭子标准,检查什么是鸭子 1、鸭子在鸟基础上有其他特征,先定义一个鸟接口: interface Bird{...,定义鸭子接口 interface Duck extends Bird{ //嘎嘎叫 call:"gagaga" //会游泳 swim:true //走路鸭子...runLike:"duck" } 3、 检查鸡是不是鸭子类型 ?...它不会帮你检查类是否具有某些私有成员。 类静态部分与实例部分区别 构造函数属于静态部分,无法进行类型检查。 这里因为当一个类实现了一个接口时,只对其实例部分进行类型检查

60030

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券