位置: 编程技术 - 正文

详细介绍Python的鸭子类型(python基本介绍)

编辑:rootadmin

推荐整理分享详细介绍Python的鸭子类型(python基本介绍),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:介绍python的主要功能,谈下python的gil,简单介绍一下python,python主要介绍哪些内容,简单介绍一下python,python简要介绍,python的介绍和用途,python的介绍和用途,内容如对您有帮助,希望把文章链接给更多的朋友!

鸭子类型基本定义

首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。

以下是维基百科中对鸭子类型得论述:

在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:

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

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。

鸭子类型通常得益于不测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。从静态类型语言转向动态类型语言的用户通常试图添加一些静态的(在运行之前的)类型检查,从而影响了鸭子类型的益处和可伸缩性,并约束了语言的动态特性。

详细介绍Python的鸭子类型(python基本介绍)

python中的具体实现

下面的代码就是一个简单的鸭子类型

对于一个鸭子类型来说,我们并不关心这个对象的类型本身或是这个类继承,而是这个类是如何被使用的。我们可以通过下面的代码来调用这些类的方法。

watch_duck函数接收这个类的对象,然后并没有检查对象的类型,而是直接调用这个对象的走和游的方法,如果所需要的方法不存在就报错。

具体在python中鸭子类型的体现如下面的代码所示

在python把上述代码的实现方法叫做protocol(协议),这些protocol可以看作是通知型的接口,它规定了调用方使用该功能要调用对象的哪些方法,被调用方要实现哪些方法才能完成这个功能。它和java中的接口区别在于java中的接口功能实现需要通过继承,继承的类必须实现接口中的所有的抽象方法,所以在Java中强调的是类型的概念,而python中的protocol更多的是通知性的,一个函数规定要实现某个功能需要调用传入对象的哪些方法,所有实现这些方法的类就可以实现这个功能。

具体从上面两个类来说,第一个类实现了__getitem__方法,那python的解释器就会把它当做一个collection,就可以在这个类的对象上使用切片,获取子项等方法,第二个类实现了__iter__和next方法,python就会认为它是一个iterator,就可以在这个类的对象上通过循环来获取各个子项。一个类可以实现它有能力实现的方法,并只能被用于在它有意义的情况下。

这两个类和上面的鸭子类相比较,其实用于切边的[](它其实调用的是python的slice函数)和用于循环的iter()就相当于watch_duck函数,这些函数都接收任意类的对象,并调用实现功能所需要的对象中的方法来实现功能,若该函数中调用的方法对象里面不存在,就报错。

从上面可以看出,python鸭子类型的灵活性在于它关注的是这个所调用的对象是如何被使用的,而没有关注对象类型的本身是什么。所以在python中使用isinstance来判断传入参数的类型是不提倡的,更pythonic的方法是直接使用传入的参数,通过try,except来处理传入参数不符合要求的情况。我们应该通过传入对象的能力而不是传入对象的类型来使用该对象。

总结

标签: python基本介绍

本文链接地址:https://www.jiuchutong.com/biancheng/385336.html 转载请保留说明!

上一篇:一键搞定python连接mysql驱动有关问题(windows版本)(python连接mq)

下一篇:Python读写Json涉及到中文的处理方法(json python 字段读取)

  • 居民和非居民企业的概念
  • 增值税税率
  • 计提城建税怎么算
  • 发票开错抬头做红字发票的账务处理
  • 财务报告与财务报表的联系与区别
  • 营业外收入汇算清缴需要调整吗
  • 季度30万免增值税什么时候结束
  • 给客户多开了发票,下月少开可以吗?
  • 系统集成 税点
  • 一揽子交易定义
  • 以前年度损益调整借贷方向
  • 印花税减半征收优惠政策2022
  • 递延收益摊销金额怎么算
  • 给别人开的维修费专票怎么入账
  • 非同一控制下企业合并对价小于可辨认
  • 同城酒店怎么开发票
  • 建材公司将自产产品卖出
  • 园林绿化公司购入剪刀怎么做会计分录
  • 减税降费新政策解读
  • 花椒油的税率
  • 进项抵扣抵扣
  • 解析居民企业非货币性资产对外投资政策
  • 股息率超过10%的公司
  • 资产原值包含残值吗
  • 中介公司属于工业企业吗
  • 普通发票每个月有限制吗
  • 个税验证不通过怎么办
  • 外汇网上申报操作流程图
  • 残疾人不用交医保社保
  • 商品盘点溢余短缺的核算方法有哪些?
  • 软件开发过程中采用多种图形化工具
  • 公司名下的房产出租需要交哪些税
  • 进口商品关税调整
  • 苹果mac os x 怎样打开DVD播放程序
  • apple mac 系统
  • 生产税有哪些
  • 出租固定资产收入计入什么科目
  • 预缴增值税会产生滞纳金吗
  • neoDVDstd.exe - neoDVDstd是什么进程 有什么用
  • fsck是什么文件
  • 如何用php制作表格
  • 土地使用税计入管理费用还是税金及附加
  • 支付产品运输费怎么入账
  • 写字楼租赁房产税
  • 反射机制python
  • 转账支票适用范围
  • 增值税的滞纳金税率
  • 印花税实收资本和资本公积
  • 企业付给个人工资怎么算
  • 信用卡的还款方式怎么查
  • 进项税额有留底怎么做分录
  • 融资租赁租出的固定资产账务处理
  • 口罩属于哪个科目 会计
  • 六税一费减免
  • 未开票的收入怎么申报增值税
  • 白条入账的新会计政策
  • 收不到物业费不想干了
  • 期初与年初有什么区别
  • 如何结转完工产品成本和已销产品成本
  • 收购农产品没有发票
  • 会计错账的更正方法及适用范围
  • SQL Server AlwaysOn读写分离配置图文教程
  • ubuntu和window双系统
  • 班班通一直正在启动什么原因
  • win7用户在哪
  • Win7旗舰版系统文件名称
  • glibc2.14安装
  • 批处理文件命令大全
  • nodejs项目搭建
  • linux中命令行
  • java获取两个日期间的所有月份
  • 完美解决怠速抖动加油就平稳
  • angular使用
  • javascript中var的作用
  • 说一说我下乡插队时的那点事
  • 分享面试流程
  • 广州市税务局长
  • 中国的消费税率是多少
  • 地税局公务员工作内容
  • 如何做好巡察组组员
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设