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

Python 语言中的 “鸭子类型”

提到 “鸭子类型”,就要先讲讲面向对象编程语言中的继承和多态。...这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”...这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。...而在静态语言中,如 Java ,如果需要传入 Animal 类型,则传入的对象就必须是 Animal 类型或者它的子类,否则,将无法调用 run() 方法。 参考 [1]....Polymorphism - Python Tutorials

71840

浅谈Python鸭子类型

1、什么是“鸭子类型” Python崇尚“鸭子类型” 对于鸭子模型常见的说法是:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”...例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法。...在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和"叫"方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。...不需要类型声明,而java在使用时要定义好类型 (order.account(Payment pay_obj)),所以你传入别的类型对象一定报错 但是python因为是动态语言所以传入的对象只要拥有调用的方法即可视为...例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法 在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和

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

语言设计中的鸭子类型风格

image.png #思特沃克好声音# (图片:网络) 在动态语言的世界里一直流传着一种叫做鸭子类型的风格,其来自谚语:“如果行鸭子一样走路,像鸭子一样呱呱叫,那它就是一只鸭子”。     ...从鸭子类型,我们可以联想到它的推导,并不在乎类型的真正实体,只要他的行为有鸭子的特性,那么我们就可以把它当做一只鸭子来看到。...在动态语言设计中,可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型的实例,而不在于它是否显示的实现或者继承。      鸭子类型在动态语言中被广为奉行。...如果你是一个优秀的程序员,动态语言这种检查的推迟对你并无什么问题,因为你能够有条理次序的节奏型开发。      关于鸭子型风格这里还得必须提到go语言,也是go语言带来我对这种风格的思考。...(I).Get() }    Go语言不同于其他鸭子类型语言的是它实现了在编译时期检查,同时也不失这种自由度。

77170

Python 中什么是鸭子类型?

在本教程中,我们将学习鸭子类型。这是 Python 中的一个流行术语,来源于这样一句话:“如果它走路像鸭子,游泳像鸭子,看起来像鸭子,那么它很可能应该是一只鸭子。”...上面的陈述给出了一个识别鸭子的想法。这里我们不需要有鸭子的基因组序列。我们通过它的行为和外观得出结论。 我们将讨论 Python 编程中鸭子类型的确切含义。...Python 遵循的是 EAFP (请求原谅比请求允许更容易)而不是 LBLY (三思而后行)的哲学。EAFP 与“鸭子类型”风格有些联系。...Python 解释器接受同一变量数据类型的变化。这是一种动态打字行为。 许多其他编程语言,如 Java、swift 都是静态类型。我们需要用数据类型声明变量。...鸭分型的概念 前面我们已经讨论过 Python 是一种动态类型语言。但是,我们可以将动态方法用于自定义数据类型。让我们理解下面的例子。

18940

python3之鸭子类型

鸭子类型 简单的跟大家聊一聊python中的鸭子类型,通过一个例子来理解就很简单了。 一句话:“当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也想鸭子,那么这只鸟就可以被称为鸭子。”...,也就是我并不关心对象什么类型,到底是不是鸭子,只关心行为。 假如定义了一个函数,传入一个类对象,我们并不需要知道这个类对象是不是我们想要的类对象,只要他有需要的方法,那么这个函数就可以执行。...# 1、定义两个类型,一个是鸭子类,一个是人类,他们都拥有“走”和“游泳”的方法 class Duck(): def walk(self): print("I'm a duck,...print("This one walk like a duck") def swim(self): print("This one swim like a duck") # 鸭子类型...python中的鸭子类型 a = [1, 2, 3] b = (4, 5, 6) # 元组 c = "123" # 字符串 d = {"a": 100} # 字典 e = 1 # int a.extend

75010

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

策略模式一文中,传统的策略模式实现方式我也是用 Python 代码实现的,在 java 或 C# 等语言中,实现方式也差不多。...然而,Python 语言没有 interface 关键字,就是说,Python 里没有像 java、C# 一样的接口。...抽象基类是在 Python 语言诞生 15 年后,Python 2.6 才引入的。这里我们不详细介绍抽象基类,因为即便现在也很少有代码使用抽象基类。...对于多态,Python 有更好的实现方式——鸭子类型(duck typing)。 协议和鸭子类型 所谓 鸭子类型 就是:如果一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就是鸭子。...Python 不是不支持多态,而是 Python 本身就是一门多态的语言

97320

鸭子测试看 Go 语言的接口实现

鸭子类型有时候在动态语言中,被用于实现多态。下面看一个多态的例子,它是Python语言的。...在这个示例中,我们可以认为 ClassA 和 ClassB 是一对鸭子类型。 动态语言的这种「鸭子类型」方便性,既是它的优点,也是它的缺点。...Go 语言作为高级编程语言的后起之秀,它兼具了静态语言和动态语言在类型设计上的优点,它既让开发者没有类型声明之累,又可以在编译阶段就确定类型错误。在这一点上,Go 语言是怎么做到了呢?...就是依靠「鸭子测试」的判定思想,下面看一个 Go 语言实现接口的例子。...Go 语言关于接口的实现,就是一种「鸭子测试」的判定,只要一个结构体实现了某个接口的所有方法,就认为该结构体实现了该接口。这种做法简直太方便了!

43710

鸭子类型

正文 学习 Python 的时候经常看到一个名词:鸭子类型,网上最常见的解释是:如果它走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks...但仅仅通过这一解释并没有办法让我很好的理解到底何为鸭子类型,于是我从网上找了一些案例来更好的理解: Python 中任何实现了 __iter__ 和 __next__ 方法的对象都可以成为迭代器。...# python3 # 例子来源:FOOFISH-PYTHON 之禅 class Foo: def __iter__(self): pass def __next...,被称为「鸭子」的对象本身是很么类型不重要,重要的是它完成了「鸭子」所能完成的一切,所以它就配得上「鸭子」这个称呼。...所以我认为(不要你以为,我要我以为,哈哈):在(任何语言的)编程中能够套用上面逻辑的对象都可以成为鸭子类型。 参考 FOOFISH-PYTHON之禅-Python:动态语言鸭子类型

37810

什么是鸭子🦆类型?

什么是鸭子类型 鸭子类型是很多面向对象(OOP)语言中的常见做法。它的名字来源于所谓的“鸭子测试”: 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。...为什么需要鸭子类型 在一些动态语言中,鸭子类型的常见用法就是假设给定值符合我们预期的,你可以先尝试执行一个操作,然后我们再去处理不符合预期的情况下的异常。...比如在下面这段 Python 代码中: from typing import Any def is_duck(value: Any) -> bool: try: value.quack()...在 Python 中,try-except 是一种常见的写法,它也被很多库(比如hasattr)广泛使用。...简单的说,就是告诉编译器这个可能是鸭子的东西就是一只鸭子

1.7K20

鸭子类型

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

54141

Python 中的鸭子类型和猴子补丁

原文链接: Python 中的鸭子类型和猴子补丁 大家好,我是老王。...Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这两个词而已。...更通俗一点的说: 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。 也就是说,在鸭子类型中,关注点在于对象的行为,能作什么;而不是关注对象所属的类型。...Python 是一门动态语言,没有严格的类型检查。只要 Duck 和 Dog 分别实现了 eat 和 walk 方法就可以直接调用。...比如用 Go 语言来实现鸭子类型,代码是这样的: package main import "fmt" // 定义接口,包含 Eat 方法 type Duck interface { Eat() }

55300

鸭子类型:Python中的灵活多态性

引言在Python编程世界中,有一种特殊的类型,被戏称为“鸭子类型”。这个概念源自一句格言:“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子。”...这种理念在Python中得以充分体现,它让我们在编写代码时更加关注对象的行为,而不是对象的类型。本文将深入探讨鸭子类型在Python中的应用,以及如何利用这一特性编写更加灵活、可复用的代码。1....3.2 鸭子类型与迭代器在Python中,迭代器是鸭子类型的一个典型应用。迭代器对象必须实现__iter__()和__next__()方法,但不需要显式地继承任何特定的接口或类。...结语鸭子类型是Python中一种强大的编程理念,它使得我们能够编写更加灵活、可复用的代码,不受类型限制的约束。通过关注对象的行为,我们可以写出更加通用、简洁的代码,提高了代码的可读性和可维护性。...在你的Python编程旅程中,不妨多多尝试鸭子类型,体验它的便利之处。无论是函数参数、迭代器还是其他场景,鸭子类型都可以为你的代码带来更多可能性。希望本文对你理解鸭子类型有所帮助。

28040

不知道鸭子类型就当没学过python

本文主要介绍如何用python鸭子类型的实现方式,用魔法函数来实现自定义类,想歪的同学快出去面壁思过,所需基础可参考本公众号之前的文章。...python为动态语言,全面向对象编程:所有得类都是type的实例,除object来其他类都继承object类,都是可以修改的。...魔法函数贯穿了python的面对对象实现机制 这里就不得不介绍鸭子类型,鸭子类型简单点来说,就是如果你具有鸭子的属性,那你就是鸭子。比如,鸭子会嘎嘎叫,鸭子会两只脚走路。...那么你如果实现了这两个方法,那么就可以说这个类型是鸭子类。这一点和许多静态语言是相反的,静态语言往往是先定义一个实体,再去描述实体的属性和方法。...中,我们经常会使用len()函数获取一个对象的长度,实际上在其内部会自动调用该对象的__len__()方法 tips: python内置类型(int list dict)底层均为c语言写的, 需要用cython

50920

python面向对象-封装-property-接口-抽象-鸭子类型-03

被封装内容的特点 外界不能直接访问 类内部依然可以使用 权限 利用好封装的特性就可以控制属性的权限(接着往下看) python中只有两种权限 1.公开的属性或方法(默认就是公开的) 2.私有的属性或方法...而贴心的python提供了 property装饰器 property 好处 # property 装饰器可以解决上面的问题,把方法伪装成属性,让私有属性与普通属性的调用方式一致 property 有三种装饰器...d = D() # 把抽象类的方法都实现了,不会报错 鸭子类型 由来:python 一般不会限制你必须怎么写,作为一个优秀的程序员,就应该自觉遵守相关协议,所以就有了鸭子类型这一说 如果这个对象长得像鸭子...(属性),走路像鸭子(方法),那么他就是鸭子(没有说必须方方面面都像) 鸭子类型:拥有相同属性和方法,那么就可以把它看成同样的类,也可以提高扩展性 代码案例 # 默认按USB标准制作鼠标 class...接口与抽象类小结: 小结: 接口是一套协议规范,明确子类们应该具备哪些功能 抽象类是用于强制要求子类必须按照协议中的规定来(接口中定义的)实现 然而python 不推崇限制你的语法,我们可以设计成鸭子类型

52920

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

这就像是我看到了一只鸟,只要它能像鸭子一样叫,像鸭子一样走路,有鸭子一样的白色羽毛,那么,无论它实际上是什么东西,我都认为它是鸭子。 说完这段话,一道光从你的镜片上一闪而过。你心里想,这下稳了。...面试官又问:那你用 Golang 写一个鸭子类型的例子。 你一想,Golang 是静态语言啊,参数都要声明类型的,怎么绕过它的类型检测呢?你又转念再一想,不对,Golang 确实可以绕过类型检测的。...于是你刷刷刷写下来一段 Golang 语言的代码: package main import ( "fmt" ) type Animal interface { Sleep()...我们再用 Python 举个例子: 确保传入的变量必须是特定类型,再执行对应的方法 # 确保参数是特定类型再调用里面的方法 def check(animal): if isinstance(animal...如果这个对象没有eat方法,Python 自动就会抛出异常。 def check(animal): animal.eat() 在鸭子类型这种设计风格中,开发者不关心对象是什么类型。

72840

Python中的协议 、鸭子类型 、 抽象基类 、混入类

本篇文章探讨一下python中的几个概念:协议 、鸭子类型 、 抽象基类 、混入类。 一、协议 在python中,协议是一个或一组方法。...二、鸭子类型(duck typing) 多态的一种形式,在这种形式中,对象的类型无关紧要,只要实现了特定的协议即可。...因此我们可以把Eg1称为一个鸭子类型,即 只关注它是否实现了相应的协议,不关注它的类型。...注意,自己定义的抽象基类要继承 abc.ABC(abc.ABC 是 Python 3.4 新增的类,python2的语法不是这样的)。...最近热门文章 用Python更加了解微信好友 如何用Python做一个骚气的程序员 用Python爬取陈奕迅新歌《我们》10万条评论的新发现 用Python分析苹果公司股价数据 Python自然语言处理分析倚天屠龙记

1.8K20

你知道什么是Python里的鸭子类型和猴子补丁吗?

有时候我们会听到Python里所谓的鸭子类型和猴子补丁的说法,乍一听还以为是来到了动物园,Python这只大蟒蛇还可以和鸭子和猴子一起玩耍?...非也非也,鸭子类型和猴子补丁实际上是两个生动有趣的比喻,用来说明Python的动态特性。 鸭子类型?(duck type) 是对Python中数据类型本质上是由属性和行为来定义的一种解读。 猴子补丁?...一,鸭子类型 鸭子类型是对Python中数据类型本质上是由属性和行为来定义的一种解读。 Python是一种动态语言,不像Java和C++这种强类型语言Python里实际上没有严格的类型检查。...只要某个对象具有鸭子的方法,可以像鸭子那样走路和嘎嘎叫,那么它就可以被其它函数当做鸭子一样调用。...是动态语言,其数据类型属于鸭子类型,没有严格类型检查, # Goose这个类具有和Duck这个类相同的方法, # ee这只鹅划起水来像只鸭子,叫起来也像一只鸭子, # 所以duckshow这个函数也可以对

2.5K20

面向对象:接口思想、多态、鸭子类型、反射

老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同 总结:多态性的好处: 增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用 增加了程序的可扩展性 三、鸭子类型...如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子 #二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用 class TxtFile: def read(self):...> (1, 2) {'a': 3, 'b': 4} 六、异常处理 程序运行时的错误 程序中的异常处理机制: 程序中的所有异常都会被处理 程序中的所有异常都需要手动处理 如果没有手动处理异常,异常会交给Python

41730

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

python不支持多态,随着对python理解得加深,对python中得多态又有了一些看法。 首先python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。...在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。...在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。...从静态类型语言转向动态类型语言的用户通常试图添加一些静态的(在运行之前的)类型检查,从而影响了鸭子类型的益处和可伸缩性,并约束了语言的动态特性。...a=A()时,a是一个A类型的引用,我们可以说a是A类型的,如果再将a赋值3,a=3,此时a就是一个整型的引用,但python并不是弱类型语言,在python中'2'+3会报错,而在php中'2'+3会得到

41710
领券