“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就能够被称为鸭子”

python的鸭子类型的设计让python的诸多对象的分类和应用更加灵活,需要注意类型和对象的区别(python的类也是对象),类型概念包含的范围更广,比如可迭代类型就包括list,tuple等类,这里list和tuple是类的概念,可迭代类型是类型的概念,可以看到可迭代类型包含了list和tuple这两个类,所以说类型的概念大于类的概念,当然一个类可以是属于多个类型的,比如list既属于可迭代类型,又属于序列类型。

python内置了一些类型,比如上面说的可迭代类型,还有数值类型(int,float,bool等),序列类型(list,str,tuple等),上下文管理类型(可以使用with语句的类型)等等。

那么这和鸭子类型有啥联系呢,再回到第一句话,一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就能够被称为鸭子。这里不要去把鸭子理解为我们日常生活中见到的那种真正的鸭子,而是应该把它理解为一个类型(类型,而不是类),我们平时说的鸭子当然本身就属于鸭子类型了,但是如果现在还有一类鸟(类,而不是类型)也看起来像鸭子,游泳像鸭子,叫起来叫鸭子,虽然不是真正的鸭子,我们也把它归类到鸭子这个类型里面,这样做有什么好处呢?比如你们部门去野炊,你领导让你去抓一只鸭子来,并且说只要是鸭子类型的都可以,这时候你就不必限定只抓真的鸭子,只要是看起来像鸭子,游泳起来像鸭子,叫起来像鸭子的都可以,这就很灵活了。再放到代码中来理解一下

我们定义:实现了gaga方法的对象都属于鸭子类型,实现了wangwang方法的对象都属于狗子类型,并且规定只要属于鸭子类型的对象就可以输出“i am duck”,只要是属于狗子类型的对象就可以输出“i am dog”

class Animal01(object):
def gaga(self):
pass def wangwang(self):
pass def __str__(self):
return "animal01" class Animal02(object):
def gaga(self):
pass def __str__(self):
return "animal02" class Animal03(object):
def wangwang(self):
pass def __str__(self):
return "animal03" animal_list = [Animal01(), Animal02(), Animal03()] # 实例化三个对象 for animal in animal_list:
try:
animal.gaga() # 如果实现了gaga方法,那么就认为它是鸭子类型
print(animal, "is duck")
except Exception: # 如果没有实现gaga方法,说明不是鸭子类型
pass for animal in animal_list:
try:
animal.wangwang() # 如果实现了wangwang方法,那么就认为它是狗子类型
print(animal, "is dog")
except Exception:
pass 输出结果:

animal01 is duck
animal02 is duck
animal01 is dog
animal03 is dog

可以看到animal01实现了gaga也实现了wangwang方法,即,animal01既看起来像鸭子,也看起来像狗子,所以它既是鸭子类型也是狗子类型,所以输出结果中都有它,其余两种要么看起来只像鸭子,要么只像狗子。

那具体在python中有什么体现呢?

比如python的列表有个方法叫extend,先看下这个函数的定义:

作用是在一个列表后面拼接另一个可迭代类型的对象,比如:

list_a = [1, 2, 3]
list_b = [4, 5]
set_c = (6, 7) list_a.extend(list_b)
list_a.extend(set_c)
print(list_a) 输出结果:
[1, 2, 3, 4, 5, 6, 7]

可以看到list_b是一个列表,set_c是一个集合,他们都是可迭代类型,都可以通过list_a的extend方法拼接到list_a后面,这样就体现了python的灵活性了,因为按我们一般的思路,一个列表后面只能是拼接一个列表才对,可是这里却不这么限定,只要是个可迭代类型就都可以拼接,极大丰富了应用的范围。这就体现了鸭子类型的优势了,list和set都是可迭代类型(即都看起来像鸭子),只要是可迭代我就给你可拼接到一个列表的功能(只要是鸭子类型就可以做某件事)

python鸭子类型的更多相关文章

  1. python 鸭子类型

    首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型. 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不 ...

  2. Python鸭子类型思想

    动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it ...

  3. python鸭子类型(duck type)

    1.什么是鸭子类型顾名思义,就是看起来像鸭子的类型,就可以叫做鸭子类型所以,鸭子类型是一种不严格的类型,弱类型有相同方法的类型,可以归为一类鸭子.2.鸭子类型示例 class dog: def run ...

  4. python之鸭子类型

    python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型. 在程序设计中,鸭子类型是动态类型的一种风格,不是由继承特定的类或实现特定的接口,而是当前的方法和属性的集合决定,鸭子 ...

  5. python之类的多态(鸭子类型 )、封装和内置函数property

    一.多态 1.什么是多态:一个类表现出的多种状态--->通过继承来实现的例如:class Animal:passclass Dog(Animal):passclass Cat(Animal):p ...

  6. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  7. [py]python多态-动态语言的鸭子类型

    弱类型?强类型?动态语言,静态语言 弱类型: 在程序运行过程中,类型可变 还有一种说法: 动态 variables must necessarily be defined before they ar ...

  8. python多态和鸭子类型

    多态与多态性 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:文件分为文本文件,可执行文件(在定义角度) 比如 我们按下 F1 键这个动作: 如果当前在 Fl ...

  9. Python多态、鸭子类型

    一.多态 多态指的是一类事物有多种形态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.ab ...

随机推荐

  1. JavaScript 箭头函数

    ES6新标准增加了一种新的函数,箭头函数. x=>x*x 相当于: function (x){ return x*x; } 如果参数不是一个,就需要用括号()括起来: // 两个参数:var t ...

  2. jdk8可重复key的Map: IdentityHashMap

    编写一个多条件过滤功能时,想使用map作为过滤条件的容器,由于存在同一健匹配多个值的情况,所以就发现了jdk8的新的map:IdentityHashMap.使用它完美解决了我的问题. 对比Identi ...

  3. GCC编译UDF和gdb调试UDF

    Fluent版本:19.0 前面我们介绍过使用VS来编译和调试UDF,其实我们也可以用GCC来编译UDF.gdb调试UDF.本次介绍的方法更具有通用性,也适用于Linux下Fluent的UDF编译和调 ...

  4. centos7 安装Hadoop-2.6.0-cdh5.16.1.tar.gz

    准备Hadoop-2.6.0-cdh5.16.1.tar.gz 下载网址 http://archive.cloudera.com/cdh5/cdh/5/Hadoop-2.6.0-cdh5.16.1.t ...

  5. 【技术博客】Pytorch代码生成

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Pytorch代码生成经验文档 关于模型代码的生成,主要思 ...

  6. 声源定位之3精读《The Generalized Correlation Method for Estimation of Time Delay》

    2.2.1 标题(2019年9月5日) 估计时间差的广义互相关方法 互相关可以表示两个信号的相似程度. 计算:两个信号循环移位相乘再相加,得到的一组互相关值. 相关函数: 何为广义?通用的框架,可以设 ...

  7. 如何用 Go 实现热重启

    热重启 热重启(Zero Downtime),指新老进程无缝切换,在替换过程中可保持对 client 的服务. 原理 父进程监听重启信号 在收到重启信号后,父进程调用 fork ,同时传递 socke ...

  8. centos7.5系统elasticsearch使用滚动和全新安装升级到最新的elasticsearch7.4.2版本

    背景: 生产环境大量使用 elasticsearch 集群,不同的业务使用不同版本的elasticsearch es经常曝出一些大的漏洞,需要进行版本升级,并且使用x-pack的基本验证功能,避免用户 ...

  9. 两行命令查看自己笔记本连接的wifi密码

    打开cmd.exe窗口 第一行命令 netsh wlan show profiles 可以查看所有曾经连接过的wifi 第二命令 netsh wlan show profiles "vivo ...

  10. some try on func swap about & and *

    import "fmt" func swap(x,y *int ) { //x ,y = y,x //fault /* t := *x *x = *y *y = t */ //tr ...