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

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”

classAnimal01(object):defgaga(self):pass

defwangwang(self):pass

def __str__(self):return "animal01"

classAnimal02(object):defgaga(self):pass

def __str__(self):return "animal02"

classAnimal03(object):defwangwang(self):pass

def __str__(self):return "animal03"animal_list= [Animal01(), Animal02(), Animal03()] #实例化三个对象

for animal inanimal_list:try:

animal.gaga()#如果实现了gaga方法,那么就认为它是鸭子类型

print(animal, "is duck")except Exception: #如果没有实现gaga方法,说明不是鸭子类型

pass

for animal inanimal_list:try:

animal.wangwang()#如果实现了wangwang方法,那么就认为它是狗子类型

print(animal, "is dog")exceptException: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鸭制作类代码_python鸭子类型相关推荐

  1. python鸭制作类代码_python之鸭子类型

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

  2. python鸭制作类代码_Python动态语言与鸭子类型详解

    今天来说说编程语言中的动态类型语言与鸭子类型. 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其 ...

  3. python鸭制作类代码_Python实现多态、协议和鸭子类型的代码详解

    多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态. 所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同 ...

  4. python鸭制作类代码_详细解释ducktyping鸭子类型程序设计与Python的实现

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...

  5. python鸭制作类代码_详解duck typing鸭子类型程序设计与Python的实现示例

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...

  6. python 多态 知乎_Python鸭子类型和多态

    鸭子类型 维基百科解释: 当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子. duck typing:在程序设计中是动态类型的一种风格.在这种风格中,一个对象有效的 ...

  7. python面向对象大段代码_python粗谈面向对象(一)

    面向过程编程vs函数式编程 面向过程编程 以计算对象的元素个数为例. str_1 = 'abcdefg'count=0for i in str_1: #统计字符串元素个数 count += 1list ...

  8. java 鸭子类_Java中实现鸭子类型机制

    "当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子."[引用维基] 一般而言,鸭子类型机制常见/用于动态语言,如Python.Ruby.JS.来 ...

  9. python多线程执行同样代码_Python 多线程、多进程 (一)之 源码执行流程、GIL

    一.python程序的运行原理 许多时候,在执行一个python文件的时候,会发现在同一目录下会出现一个__pyc__文件夹(python3)或者.pyc后缀(python2)的文件 Python在执 ...

  10. python中怎么复制代码_Python对象怎么引用_Python对象怎么复制代码_一聚教程网

    本次文章要给大家讲解的是Python对象引用及复制代码,相信这也是大家问题比较大的一个点,下面为大家具体整理了操作过程,一起来了解下. 可以说Python没有赋值,只有引用.你这样相当于创建了一个引用 ...

最新文章

  1. Swift default参数
  2. MPB:北大口腔陈峰、陈智滨等-​口腔微生物组研究主要取样部位及方法
  3. php 类似微信下拉菜单,微信小程序实现下拉框(附代码)
  4. 【Python入门】Python字符串的45个方法详解
  5. Core Data(3)- 使用绑定
  6. 小白学python需要多久_小白学Python | 你还在说你入不了门吗
  7. 原码、反码、补码,以及负数的位操作
  8. convert.todatetime指定日期格式_MATLAB的时间与日期
  9. 文件夹的最小化时,上面的名字。
  10. Java Web 项目音乐网站的开发与实现
  11. XMPP即时通讯基础知识
  12. Android ConstraintLayout布局详解
  13. 覆盖计算机网络分类有哪些 英语缩写,简述按覆盖范围划分计算机网络的分类类型有哪些?英语缩写分别是什么?...
  14. 脉冲神经网络 神经元模型-Izhikevich模型(3)
  15. 在Idea中使用Git后,类名各种颜色代表的含义
  16. 服务器开着但显示器键盘没反应,电脑开机 键盘灯正常亮,可以控制,显示器却没反应 是怎么回事...
  17. nacos cloud 配置中心中 修改properties格式内容并发布然后在浏览器页面刷新无效果
  18. scrapy---下载中国大学慕课课程视频及文件
  19. 别再问我如何制作甘特图了!
  20. 计算机毕业设计之java+javaweb的蛋糕甜品商城系统

热门文章

  1. 原生JS实现登录框邮箱提示
  2. drupal与html转换,HTML转Drupal主题的方法
  3. Excel 常用的九十九个技巧 Office 自学教程快速掌握办公技巧
  4. 饮用水中如何去除硝酸盐 溴化物 铬 等有害物质
  5. 博士申请 | 美国匹兹堡大学高伟教授招收Mobile AI方向全奖博士生
  6. 如何把自己打造成技术圈的papi酱
  7. 思科模拟器的远程连接交换机的实现
  8. Office Web Add-in的技术原理和开发常见问题剖析
  9. windows系统更新失败无法启动的解决方法
  10. python导入包总是失败