关于Python鸭子类型

Python—什么是duck type鸭子类型 a=A()时,a是一个A类型的引用,我们可以说a是A类型的,如果再将a赋值3,a=3,此时a就是一个整型的引用,但python并不是弱类型语言,在python中'2'+3会报错,而在php中'2'+3会得到5。a,b,c,d都是A类型的变量,所以可以得到预期的效果(从java角度的预期),e并不是A类型的变量但是根据鸭子类型,走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子,e有prt方法,所以在test方法中e就是一个A类型的变量,f没有prt方法,所以f不是A类型的变量。 阅读详情

Python对实现多态性的要求很宽松,这就代表我们可以对不同对象调用同名的操作,甚至不用关注和谐对象的类型是什么,我们称这样的方式叫做鸭子类型。说的再通俗一点,就是如果某个对象的形状像鸭子,走的像鸭子,叫声像鸭子,那么就可以称这个对象是鸭子。当然这是通俗的解释,python中的鸭子类型也是这个道理,我们用实例解释一下。

下面我们定义了一个父类名为Quote,它含有两个who和says方法,以及定义了两个子类QuestionQuote和ExclamationQuote,这两个子类中都声明了says方法,也就是覆盖了父类的says方法。

class Quote():
    def __init__(self, person, words):
        self.person = person
        self.words = words
    def who(self):
        return self.person
    def says(self):
        return self.words + '.'
    
class QuestionQuote(Quote):
    def says(self):
        return self.words + '?'
    
class ExclamationQuote(Quote):
    def says(self):
        return self.words + '!'
    
hunter1 = Quote('James', "I'm hunting rabbits")
print(f'{hunter1.who()} says: {hunter1.says()}')

hunter2 = QuestionQuote('Mary', "What's up")
print(f'{hunter2.who()} says: {hunter2.says()}')

hunter3 = QuestionQuote('Tom', "It's rabbit season")
print(f'{hunter3.who()} says: {hunter3.says()}')

# 输出内容:
# James says: I'm hunting rabbits.
# Mary says: What's up?
# Tom says: It's rabbit season?

上述例子其实是一个很简单的继承关系,声明了不同对象实例,分别都调用各自方法输出各自方法定义的内容,除了没有被覆盖的word方法任沿用于父类。

我们继续定义一个BabblingBrook类,它也包含两个方法who和says,这里的方法其实和上面那个例子里的who和says没有任何关系,只是同名而已。紧接着可以看到我们又一定了一个公共的who_says(obj)函数,然后我们调用它并把所有例子中生成的实例对象传递给who_says(obj)函数的obj变量,代码最后部分,你可以看到对不同对象执行who()和says()方法都是可以的,而且都返回了各自方法所定义的实际内容。

class BabblingBrook():
    def who(self):
        return 'Brook'
    def says(self):
        return 'Babble'
    
brook = BabblingBrook()

def who_says(obj):
    print(f'{obj.who()} says: {obj.says()}')
    
who_says(hunter1)
who_says(hunter2)
who_says(hunter3)
who_says(brook)

# 输出内容:
# James says: I'm hunting rabbits.
# Mary says: What's up?
# Tom says: It's rabbit season?
# Brook says: Babble

这就是我们说的鸭子类型,不用管对象本身是谁,都可以调用同名方法,只要对象有这个方法就行。(反过来说就是只要有这个行为,样子,我们认为它就是只鸭子。)

79、Python之鸭子类型:没有听过鸭子类型?关键在于认知的转变 所谓“鸭子类型(Duck Typing)”,是一种动态类型系统的编程概念。其核心思想来自于詹姆斯·惠特科姆·莱利的鸭子测试:“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子”。换句话说,在鸭子类型中,对象的有效性不依赖于其显式的类型,而是依赖于对象是否具有所需要的属性和方法。可以粗略的理解为,所谓的实体的强类型,更像是一种标签。而我们在实际业务场景中,需要的是某些能力、行为。 阅读详情

相关推荐

python:鸭子类型使用场景

鸭子模型是Python中的一种编程哲学,也被称为“鸭子类型”。它来源于一句话:“如果它走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子。”这个哲学思想强调对象的行为比其具体类型更重要。与C++、Java等编译型语言不一样的是,Python作为解释器语言,其语言层面的设计理念有独特之处,鸭子模型便是其中之一。在面向对象的世界中,编译型语言判断一个对象是否隶属于某个类,依靠的是类的继承机制,换句话说,即使一个对象实现了某个类的所有方法也不行;

a232884c的博客 1679

python什么是鸭子类型

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

guiyin1150的博客 6156

Python之:Duck Typing 鸭子类型

Duck Typing 鸭子类型 Python界有这么一句话: “只要你走路像鸭子,叫起来像鸭子,我就把你当成鸭子。 这就是传说中的鸭子类型,用来形容Python对待类型的一种态度。它有别于Java等强类型语言。 Java对待类型的态度是: “你必须是真正的鸭子(或者继承自鸭子),否则就算你走路像鸭子,叫起来像鸭子也不行。 来,上代码! 这是鸭子类,它有两个关键方法:鸭子叫,鸭子步。 class Duck: def duck_walk(self): print('走🦆步') def du

Yuki1127918的博客 1000

Python中的鸭子模型

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

m0_59236602的博客 1770

Python学习笔记——鸭子类型(duck typing)

前言 在实习期间,由于工作需要首次接触了Python这一门语言,由于学习和使用的时间非常短,所以当时认为,作为一门解释性语言,在做Web开发的方面,Python和PHP的差别不大,甚至在一些应用场景上没有PHP来的简单粗暴。后来,在导师的推荐下,通过《流畅的Python》又一次深入的学习了Python,大致从数据结构、函数、面向对象和控制流程这几个部分深入的学习了这一门语言,对其中作为一等对象的函...

beacon的专栏 9873

Vivado FIR Complier_IP核使用方法

文章依靠该IP核对应手册PG149写的,因为笔者需求简单,没有深入挖掘功能,可以自行下载学习。

2302_80180551的博客 3985

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

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

xx_nm98的博客 1791

h5页面调用微信JS-SDK分享到微信好友或者朋友圈的配置

1.引入js <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> 2.在页面添加配置 <script type="text/javascript"> var url = location.href..

tiantiandashi的博客 2万+

Python-鸭子类型

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

2501_92004703的博客 1053

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py和Pandas库,详细演示了如何高效读取HDF5格式文件、理解数据结构、提取关键特征(如传感器数据与剩余使用寿命RUL),并整合为可用于预测性维护分析的DataFrame,帮助研究者和工程师快速上手这一重要的工业时序数据集。

weixin_29083373的博客 278

CUDA编译踩坑实录:如何正确设置-gencode参数适配你的GPU算力

本文深入解析CUDA编译中-gencode参数的核心原理与实战配置,帮助开发者解决常见的'Unsupported gpu architecture'错误。通过厘清虚拟架构与真实架构的区别,并提供多版本兼容的CMake配置方案,确保编译出的代码能精准适配不同GPU算力,兼顾性能与广泛兼容性。

weixin_28829903的博客 338

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

鸭子类型

闻韶 4764

Spring Boot入门(02):【教程】轻松搭建Spring Boot开发环境,启动你的第一个Web项目!

快速搭建开发环境和启动项目是每个开发人员必备的技能。本文将为您提供一些简单易懂的方法和技巧,以帮助您快速搭建开发环境和启动项目。我们将介绍如何选择适合您的开发工具、配置您的操作系统、安装必要的软件包和依赖项,并开始编写您的第一个应用程序。无论您是一位新手还是一位经验丰富的开发人员,本文都会给您提供有用的信息和实用的建议,让您在最短时间内快速搭建和启动开发项目。

**My Coding Family** 22万+

【Python基础】Python鸭子类型:如何在Python中让鸭子飞?

鸭子类型深深植根于Python语言哲学之中,它鼓励关注对象行为而非类型标签,塑造了Python独特的动态、灵活、易读易写的编程风格。这种类型系统的特性极大地简化了代码,促进了代码的复用与模块化,成为Python在数据分析、Web开发、人工智能等领域广泛应用的关键因素之一。

chengxuyuanyy的博客 1451

MimicKit 人形机器人强化学习全身模仿控制算法使用教程

本文介绍了MimicKit运动模仿算法框架的使用指南。主要内容包括:1)安装IsaacGym和依赖项;2)训练模型命令及参数说明;3)测试模型的方法;4)分布式训练配置;5)使用TensorBoard可视化日志;6)动作数据格式说明。该框架支持DeepMimic、AMP、ASE、ADD等算法,包含PPO、AWR等强化学习算法,适用于物理仿真角色动画控制研究。

机器人控制与仿真应用 1199

PowerShell 升级到 v7 并设置为默认版本(详细操作指南)

本文详细介绍了如何将PowerShell升级到v7并设为默认版本。PowerShell 7基于.NET Core构建,具有跨平台支持、性能优化和新语法特性等优势。文章提供了多种安装方法(MSI安装包、包管理器)和设置默认版本的方案(修改PATH、创建符号链接、配置编辑器等),同时涵盖企业批量部署解决方案和常见问题处理。通过升级到PowerShell 7,用户可以获得更强大的命令行体验,适用于开发、运维和自动化场景。

huluang的专栏 4290

python鸭子类型_关于鸭子类型

其实对我来说鸭子类型一直是一个比较模糊的概念,因为平常不去关注,关注的时候一般是在面试或者被面试的时候,今天在看一篇博客的时候又有看到,所以就索性弄清楚```首先 与duck typing相对应的是normal typing(对象的类型决定对象的特性)*既然是相对,可以简单理解为 duck typing 就是对象的特性决定了他是什么,说一个烂大街的句子:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、...

weixin_42134054的博客 573

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python鸭子类型解释

Python 鸭子类型

sbdd6556的博客 1486

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python3之鸭子类型

鸭子类型 简单的跟大家聊一聊python中的鸭子类型,通过一个例子来理解就很简单了。 一句话:“当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也想鸭子,那么这只鸟就可以被称为鸭子。”,也就是我并不关心对象什么类型,到底是不是鸭子,只关心行为。 假如定义了一个函数,传入一个类对象,我们并不需要知道这个类对象是不是我们想要的类对象,只要他有需要的方法,那么这个函数就可以执行。 # 1、定义两个类型,...

weixin_41599977的博客 1118

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python 白鹅类型和鸭子类型

python 白鹅类型和鸭子类型 白鹅类型: 白鹅类型对接口有明确定义,比如不可变序列(Sequence),需要实现__contains__,__iter__,__len__,__getitem__,__reversed__,index,count 对于其中的抽象方法,子类在继承时必须具体化,其余非抽象方法在继承时可以自动获得,Sequence序列必须具体化的抽象方法是__len__和__geti...

weixin_42615068的博客 1365

Python中的多态:鸭子类型和接口

Python的abc模块提供了定义抽象基类和抽象方法的功能。pass# 使用示例print(dog.speak()) # 输出: Woof!print(cat.speak()) # 输出: Meow!在这个示例中,Animal类是一个抽象基类,定义了一个抽象方法speak。Dog和Cat类继承了Animal类并实现了speak方法。passpass本文详细介绍了Python中的多态概念,包括鸭子类型和接口的实现方法。通过使用鸭子类型,可以根据对象的行为而非类型进行操作,使代码更加灵活。

涛哥聊Python 2527

python的鸭子类型

这次简单介绍下 鸭子类型的概念。 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。 鸭子类型关注点在对象的行为,而不是类型。在 Python 和 Go 中都可以实现鸭子类型。 示例代码如下: class Duck: def __init__(self, name): self.name = name def quac...

一个菜鸟的博客 1715

python鸭子类型_Python的鸭子类型

‘那只东西呱呱的叫,有扁扁的嘴巴,走起路来还外八,对!它就是只鸭子’基本定义对于熟悉python的开发者来说,相信对于python的鸭子类型比较熟悉,所谓鸭子类型,在维基百科中的准确定义是‘是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定’。python中的具体实现下面的代码就是一个简单的鸭子类型classduck(...

weixin_39611049的博客 301

python中的鸭子类型

鸭子类型的名字来源于一句著名的谚语:“如果它走起路来像鸭子,叫起来也像鸭子,那么它就可以被当做鸭子。翻译成编程语言就是:一个对象的类型,不是由它继承自哪个类决定的,而是由它拥有的方法和属性(它的“行为”)决定的。换句话说,我们并不关心对象本身是什么类型(is-a关系),我们只关心这个对象能做什么has-a关系)。鸭子类型是 Python 动态类型系统的灵魂。它通过强调“行为”而非“类型”,赋予了代码极大的灵活性和表现力。理解并善用鸭子类型,是写出地道、强大 Python 代码的关键一步。

larance的挨踢生活 2803

Python中的鸭子类型:理解动态类型的力量

Python鸭子类型(Duck Typing)是一种动态类型机制,强调对象行为而非类型声明。核心思想是"如果一个对象像鸭子一样行走和叫,它就可以被视为鸭子"。这种机制使得代码更灵活简洁,允许处理任何具有预期方法的对象,但可能带来运行时错误和调试困难。典型应用包括插件系统、框架开发和数据处理。鸭子类型体现了EAFP原则,通过直接尝试操作并捕获异常来简化代码。虽然提高了扩展性和复用性,但也需注意潜在的可读性和调试问题。合理使用鸭子类型能编写更高效的Python程序。

软件科学-郝学胜 5015
上一篇: @classmethod与@staticmethod区别
下一篇: python之time模块
itanders
博客等级 码龄19年 178粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值