python鸭制作类代码_python鸭子类型
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就能够被称为鸭子”
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鸭子类型相关推荐
- python鸭制作类代码_python之鸭子类型
python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型. 在程序设计中,鸭子类型是动态类型的一种风格,不是由继承特定的类或实现特定的接口,而是当前的方法和属性的集合决定,鸭子 ...
- python鸭制作类代码_Python动态语言与鸭子类型详解
今天来说说编程语言中的动态类型语言与鸭子类型. 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其 ...
- python鸭制作类代码_Python实现多态、协议和鸭子类型的代码详解
多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态. 所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同 ...
- python鸭制作类代码_详细解释ducktyping鸭子类型程序设计与Python的实现
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...
- python鸭制作类代码_详解duck typing鸭子类型程序设计与Python的实现示例
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...
- python 多态 知乎_Python鸭子类型和多态
鸭子类型 维基百科解释: 当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子. duck typing:在程序设计中是动态类型的一种风格.在这种风格中,一个对象有效的 ...
- python面向对象大段代码_python粗谈面向对象(一)
面向过程编程vs函数式编程 面向过程编程 以计算对象的元素个数为例. str_1 = 'abcdefg'count=0for i in str_1: #统计字符串元素个数 count += 1list ...
- java 鸭子类_Java中实现鸭子类型机制
"当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子."[引用维基] 一般而言,鸭子类型机制常见/用于动态语言,如Python.Ruby.JS.来 ...
- python多线程执行同样代码_Python 多线程、多进程 (一)之 源码执行流程、GIL
一.python程序的运行原理 许多时候,在执行一个python文件的时候,会发现在同一目录下会出现一个__pyc__文件夹(python3)或者.pyc后缀(python2)的文件 Python在执 ...
- python中怎么复制代码_Python对象怎么引用_Python对象怎么复制代码_一聚教程网
本次文章要给大家讲解的是Python对象引用及复制代码,相信这也是大家问题比较大的一个点,下面为大家具体整理了操作过程,一起来了解下. 可以说Python没有赋值,只有引用.你这样相当于创建了一个引用 ...
最新文章
- Swift default参数
- MPB:北大口腔陈峰、陈智滨等-​口腔微生物组研究主要取样部位及方法
- php 类似微信下拉菜单,微信小程序实现下拉框(附代码)
- 【Python入门】Python字符串的45个方法详解
- Core Data(3)- 使用绑定
- 小白学python需要多久_小白学Python | 你还在说你入不了门吗
- 原码、反码、补码,以及负数的位操作
- convert.todatetime指定日期格式_MATLAB的时间与日期
- 文件夹的最小化时,上面的名字。
- Java Web 项目音乐网站的开发与实现
- XMPP即时通讯基础知识
- Android ConstraintLayout布局详解
- 覆盖计算机网络分类有哪些 英语缩写,简述按覆盖范围划分计算机网络的分类类型有哪些?英语缩写分别是什么?...
- 脉冲神经网络 神经元模型-Izhikevich模型(3)
- 在Idea中使用Git后,类名各种颜色代表的含义
- 服务器开着但显示器键盘没反应,电脑开机 键盘灯正常亮,可以控制,显示器却没反应 是怎么回事...
- nacos cloud 配置中心中 修改properties格式内容并发布然后在浏览器页面刷新无效果
- scrapy---下载中国大学慕课课程视频及文件
- 别再问我如何制作甘特图了!
- 计算机毕业设计之java+javaweb的蛋糕甜品商城系统