第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型

Python 继承与多态详解:面向对象编程的灵魂 继承和多态是面向对象编程(OOP)的两大核心特性,它们共同构建了代码复用和灵活扩展的基石。本文将以 Python 3 为例,深入剖析继承的类型、多态的实现机制,并通过实际案例演示如何设计符合 OOP 原则的代码架构。 阅读详情

Python是一种多态语言,其表现特征是:对象方法的调用方只管方法是否可调用,不管对象是什么类型,从而屏蔽不同类型对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
一、    Python中的协议
Python中定义某种类型是以实现了该类型对应的协议为标准的,如 可迭代对象(Iterable) 是指实现了可迭代协议的对象类型,迭代器是实现了迭代器协议的对象类型,序列是实现了序列协议的对象类型,那么具体协议是什么呢?在Python中协议是指一个或一组可供外部访问对象的特定方法(也有把对象属性作为协议的一部分,但老猿并不推荐这种使用方式),如可迭代对象是指容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问,迭代器协议必须是定义和实现了__iter__()方法和next()方法,序列协议必须实现__len__()和getitem()方法。
协议是正式的,没有强制力,可以根据具体场景实现一个具体协议的一部分。例如,为了支持迭代,只需实现__getitem__,不需要实现__len__。

二、    “鸭子类型”与多态
从Python中协议的使用可以得出,Python中的对象类型不是简单的以类型定义区分的,而是以对象是否提供了特定的访问方法来确认的。凡是实现了类型要求的方法的对象都可以看做遵守类型对应协议,就是该类型的对象,老猿理解这是Python中多态的本质,这种以协议确认类型的方法所确认的类型就是“鸭子类型”(Duck typing)。
为什么说是“鸭子类型”呢?这个所有关于“鸭子类型”介绍的文章都有共同的介绍,在这复述一下:
鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。
鸭子类型这一名字出自美国James Whitcomb Riley(有的材料说他是诗人,有的说他是测试人员,在此就不探究了)提出的如下的表述:
“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。
简单归纳就是:对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定。
以下为定义的鸭子类型与人类型,它们都有相同的方法:
class Duck():
  def walk(self):
    print('I walk like a duck')
  def swim(self):
    print('I swim like a duck')
  def quack(self):
    print('I quack like a duck')


class Person():
  def walk(self):
    print('this one walk like a duck') 
  def swim(self):
    print('this man swim like a duck')
def quack(self):
    print('I quack like a duck')

类的定义语法在后面一节介绍,但大家应该明白上述两个类的定义。可以很明显的看出,Person类拥有跟Duck类一样的方法,当有一个函数调用Duck类,并利用到了三个方法walk()、swim()和quack()。我们传入Person类也一样可以运行,函数并不会检查对象的类型是不是Duck,只要他拥有这三个方法,就可以正确的被调用。
为什么Python的多态是由“鸭子类型”来实现呢?这是由于Python属于动态语言,Python在定义变量时不指定变量的类型,而是由解释器根据变量内容推断变量类型的(也就是说变量的类型取决于所关联的对象),因此Python在判断变量类型时是看变量所具有的功能(方法)来决定。这就造就了Python的这种非常神奇的多态和“鸭子类型”,也是开发者很喜欢的一种开放的程序开发风格。

三、    鸭子类型的优点
1.    python中的鸭子类型允许我们使用任何提供所需方法的对象,而不需要迫使它成为一个子类;
2.    因为任何提供正确接口的对象都可以在python中交替使用,它减少了多态的一般超类的需求。继承仍然可以用来共享代码,但是如果所有被共享的都是公共接口,鸭子类型就是所有所需的。这减少了继承的需要,同时也减少了多重继承的需要;
3.    调用方只管调用,不管细节,不管对象是什么类型,从而可以屏蔽不同类型对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

三、    鸭子类型编程的注意事项
1.    “鸭子类型”关注是对象的方法,而不是类型,因此使用Python开发时,尽量不要使用诸如type、issubclass等函数显式地执行类型检查进行类型检查;
2.    在进行方法调用时,对于程序无法明确确认对象是否有相应方法时,可以使用异常捕获或者hasattr或callable检查所需的方法是否存在来确保对应方法可以正常调用。如果有个对象p,我们需要判断p是否有swim方法,有如下方式:
1)    使用hasattr,语句:if hasattr(p,'swim') :p.swim()
2)    使用callable,语句:if hasattr(p,'swim')  and  callable(p.swim):p.swim()
3)    使用callable,语句:if  callable(getattr(p,'swim',None)):p.swim()

本节介绍了Python中协议和“鸭子类型”的概念,并说明了Python多态与“鸭子类型”的关系,同时分析了“鸭子类型”有点以及使用的注意事项。
老猿Python(https://blog.youkuaiyun.com/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
 

Python中的鸭子类型:动态类型世界的核心思想 Python中的鸭子类型是一种基于行为而非类型的编程范式,它强调只要对象具备所需方法或属性,就可以被当作特定类型使用。这种设计理念让Python代码具有极高的灵活性,无需严格的类型声明或继承关系。典型应用包括迭代操作、文件处理、上下文管理等场景。鸭子类型的优势在于减少代码重复和增强扩展性,但也带来了类型错误延迟暴露等挑战。实践中可通过完善文档、适当类型检查、单元测试等方法来平衡灵活性与安全性。作为Python动态特性的核心体现,鸭子类型与其它动态机制共同构成了Python简洁优雅的编程风格。 阅读详情

相关推荐

【Python】新手入门:python面向对象编程的三大特性是什么?python继承、封装、多态的特性都有哪些?

Python作为面向对象编程语言,其核心特性包括继承、封装和多态。继承允许子类复用父类功能并扩展新特性,通过方法重写实现差异化。封装通过双下划线前缀隐藏内部细节,虽可强制访问但遵循约定保护数据安全。多态则基于动态类型特性,同一方法在不同子类中呈现不同行为,提升代码灵活性。三者协同构建高内聚低耦合的代码结构,既简化开发又增强可维护性。初学者可通过实践案例理解语法变形、方法重写等机制,结合工具调试逐步掌握面向对象编程精髓。

专注Python编程与网络安全领域,分享原创技术文章与靶机渗透实战经验。以清晰的逻辑解构复杂技术,用深入浅出的笔触呈现:从Python基础到高级特性,从漏洞原理到攻防实践。在这里,代码与安全交织,思考与成长同行。 833

python什么是鸭子类型

一、鸭子类型 鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定 “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为 鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆的设计模式 二、代码实现 1.鸭子类型1 class Duck: def quack(se

guiyin1150的博客 6156

el-upload自定义上传dwg/dxf文件并且携带额外参数(CAD)

需求:需要使用el-upload自定义上传cad的图片或普通图片,这边需要判断区分下,以及上传后清空上传文件列表。

请叫我欧皇!的博客 1535

Python中的鸭子模型

在这个例子里,我们可以引入一个"协议"的概念,"协议"代表一系列特征,譬如鸭子协议是walk和swim,任何实现了鸭子协议的对象都可以当作鸭子,这个就是鸭子模型和协议。这样,不同的对象可以来自不同的类,但只要它们实现了相同的协议,我们就可以在代码中使用它们。在这个例子中,我们可以看到没有显示调用Person的__enter__方法和__exit__方法,由with自动调用了,因此对于资源释放类,资源释放的操作可以放到__exit__方法中,这样配合with语句使用会方便很多,也降低出错的概率。

m0_59236602的博客 1770

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

对于工业机械臂而言,运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础,全称为Denavit-Hartenberg建模方法,是一种广泛应用于机器人运动学中的建模技术。该方法通过在每个连杆上建立坐标系,并利用齐次坐标变换来实现连杆之间的坐标转换。通过依次变换,可以推导出末端执行器相对于基坐标系的位姿,从而建立机器人的运动学方程。以IRB4600型六自由度工业机械臂为例,选择标准DH建模方法,建立其正运动学模型。

chen_mp的博客 1万+

从零到一:手把手教你用海康VisionMaster完成第一个字符识别项目(附完整流程与避坑点)

本文详细介绍了如何使用海康VisionMaster完成首个字符识别项目,涵盖从环境搭建、图像预处理到系统集成的完整流程。特别分享了Blob分析配置、字符识别优化等实战技巧,帮助开发者避开常见陷阱,快速掌握VisionMaster的基本操作,提升工业自动化场景下的字符识别效率。

weixin_29313423的博客 664

刚毕业的表弟年薪40w......程序员薪资天花板?

前不久,“腾讯2022校招-应届毕业生年薪 40 万”刷屏了… 尽管互联网大厂的薪资高不算什么新鲜事儿,但这个热搜仍然让我大受震撼。 腾讯校招官网显示,2022届腾讯校招开放技术、产品、设计等岗位共计 78 个,且以IT岗为主。 另据各大招聘平台统计数据,腾讯2022届研发岗应届生基础月薪在1.7万-2.3万之间,签字费(针对优秀人才的额外奖励)3万,股票依据不同等级从6万到20万不等,就算是最低等级的“白菜包”,年薪总包也远超40万元。 职业发展 作为一个代码打工仔,对于绝大部分程序员来说,想要成为牛

xx_nm98的博客 1791

华为防火墙USG6600全流量日志配置指南:从流量监控到NAT日志的完整方案

本文详细介绍了华为USG6600防火墙全流量日志配置方案,涵盖流量监控、NAT日志及安全事件溯源等核心功能。通过精细化配置和性能优化技巧,帮助企业构建高效、合规的日志体系,提升网络安全运维效率。文章特别强调了日志采样与字段过滤的实用方法,适用于高流量环境下的资源优化。

gin88的博客 347

Python-鸭子类型

鸭子类型(Duck Typing)是一种编程风格,它不关注对象的具体类型,而是关注对象是否实现了特定的方法或协议在 Python 中,鸭子类型是一种动态类型的风格,其核心思想是:“如果它走路像鸭子,叫起来像鸭子,那么它就是鸭子”

2501_92004703的博客 1053

提交 ieee 手稿出现:Do not include the Reviewer PDF with my submission 怎么办

IEEE投稿Reviewer PDF选项说明 投稿时出现的"Do not include the Reviewer PDF with my submission"选项控制是否附带评审专用PDF文件。Reviewer PDF是系统自动生成包含所有投稿材料的完整PDF,用于同行评审。建议保持默认不勾选状态,除非确认编辑部不需要该文件,否则可能影响审稿流程。勾选表示不附带此PDF,不勾选则会正常生成并提交该评审文件。

ZhangJiqun&191cm&85kg 2188

001、NPU是什么?为什么嵌入式设备需要它?

本文通过作者调试工业相机板卡的经历,引出嵌入式设备为何需要NPU(神经网络处理器)的探讨。文章对比了CPU和NPU的设计哲学差异,指出NPU通过专用乘加器阵列和优化的数据流,能高效处理神经网络运算。作者分析了嵌入式设备使用NPU的三大优势:算力提升、功耗降低和实时性保障,并介绍了三类常见NPU形态。通过一个YOLOv5模型调试案例,揭示了NPU使用中的常见陷阱,最后给出五条实用建议,强调理解NPU原理和局限的重要性。文章生动展现了NPU在嵌入式AI应用中的关键作用。

m0_50546716的博客 125

【Python】浅谈 鸭子类型 (Duck Typing)

鸭子类型

闻韶 4764

基于多模态融合的反无人机视觉跟踪算法研究

本研究提出了一种基于多模态融合的反无人机视觉跟踪算法,通过整合可见光、红外、深度等多种视觉信息源,提高了对无人机的跟踪精度和可靠性。设计并实现了多模态特征提取方法,针对不同模态图像的特点提取了有效的特征信息,为多模态融合提供了基础。研究了多种多模态融合策略,包括特征级融合、决策级融合和混合融合,并通过实验对比分析了它们的优缺点,确定了适合反无人机视觉跟踪的融合方法。选择并改进了跟踪算法,将多模态融合信息融入到跟踪过程中,提高了算法对复杂环境和无人机运动变化的适应性。

AI的内部世界的博客 1351

Python 面向对象编程中的多态特性详解

Python 面向对象编程中的多态特性详解

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 2339

SKILL 是什么?怎么做?五分钟 带你从入门到精通

skill-creator 是 Anthropic 官方开源的“元技能”——一个专门用来创建 Skill 的 Skill。你只需要用自然语言描述想要什么功能,它会自动生成。从更宏观的视角看,Skills 的出现标志着 AI 编程的一次范式转变。在传统的 AI 编程中,代码是确定性的:1 是 1,2 是 2。但到了大模型时代,代码变得不确定——你不知道模型会输出什么,不知道它会不会突然删掉几行代码。这种不确定性让很多开发者感到不安。Skills 把这套逻辑又拉了回来。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 641

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

HoRain云--Python多态:继承与鸭子类型实战

本文介绍了Python面向对象编程中的多态概念,重点分析了基于继承和鸭子类型两种实现方式。通过具体代码示例,展示了继承多态中父类定义通用接口、子类重写方法的模式,以及鸭子类型强调对象行为而非类型的灵活性特点。文章总结多态能提高代码可维护性和扩展性,同时提示需注意接口一致性、抽象基类使用和代码可读性等实践要点。

2401_86544677的博客 925

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

第7.28节 《Python类、类型、协议》章节总结

本章详细介绍了Python协议、多态与“鸭子类型”、类、类实例变量、类变量、实例方法、类方法、静态方法、类继承、抽象类、property函数和@property装饰器定义属性访问方法等内容,内容比较多,学习完本章,应该对Python的类知识了解比较全面,掌握“鸭子类型”、property函数和@property装饰器这些非常有Python特色的内容。到上节为止,类的基础知识部分就基本介绍完...

老猿Python 1807

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python多态与抽象类实战:从鸭子类型到支付网关设计

面向对象编程中的多态性是一种核心概念,它允许同一接口在不同对象上表现出不同行为,从而提升代码的灵活性和可扩展性。其实现原理基于方法重写和动态绑定,在Python中尤为灵活,这主要得益于‘鸭子类型’机制——只要对象具备所需方法,即可被视为同一类型,无需显式继承。这种设计模式的技术价值在于显著降低了模块间的耦合度,使系统更易于维护和扩展,符合开闭原则。在实际应用场景中,多态常用于构建可插拔的组件系统,例如插件架构、算法策略替换以及数据格式转换器等。本文以支付网关系统为例,深入探讨如何结合抽象类定义接口契约,确保

weixin_30315905的博客 337

第7章 Python类型、类、协议目录

第7.1节 面向对象程序设计的相关知识 第7.2节 关于面向对象设计的一些思考 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型 第7.4节 Python中与众不同的类 第7.5节 揭开Python类中self的面纱 第7.6节 Python中类的继承机制详述 第7.7节 案例详解:Python类继承机制 第7.8节 Python中隐秘的类封装方法 第7.9节...

老猿Python 1830

编程与数学 02-017 Python 面向对象编程 07课题、多态

多态指同一接口可处理不同对象,Python通过继承重写或鸭子类型实现,提升代码灵活性与扩展性。文章详解实现方式、优势、应用场景及与继承、封装关系,含示例与常见问题解答。

明月看潮生的博客 1033

【day24】python:类的多态

多态的本质是。

鹿鸣悠悠 852

Python面向对象编程三大特性:封装、继承与多态详解

面向对象编程(OOP)是现代编程语言的基石,其核心在于通过封装、继承和多态三大特性构建可维护的代码结构。封装通过访问控制保护数据完整性,Python使用命名约定和@property装饰器实现精细控制;继承实现代码复用,但需注意避免多重继承陷阱;多态则基于鸭子类型和抽象基类,使不同对象能响应相同接口。这些特性在电商系统、物联网设备管理等场景有广泛应用,如@property验证传感器数据可减少73%异常入库。掌握OOP原则能显著提升代码质量,在Python开发中尤为关键。

weixin_42531494的博客 261

9. python类的继承与多态

继承与多态是面向对象编程的核心特性,能够显著提升代码的复用性和灵活性。类名.__mro__

qq_17275369的博客 467

Python多态的概念和实现

Python多态的本质是。

2501_93597215的博客 361
上一篇: 第7.2节 关于面向对象设计的一些思考
下一篇: 第7.4节 Python中与众不同的类
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值