Python中的鸭子模型

“一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟可以被称为鸭子。“----鸭子模型

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

举个简单的例子:

鸭子模型的简单实例

运行一下程序,结果如下:

鸭子模型的运行结果

我们来分析下这个简单示例,首先定义了Duck类和Bird类,分别具有walk方法和swim方法,两者并不具备任何继承关系;然后定义一个duck_action函数,该函数接收一个对象,在函数内调用该对象的walk方法和swim方法;最后实例化一个Duck和Bird对象,先后传递给duck_action函数来执行,并都可以执行成功。在这个例子里,我们可以引入一个"协议"的概念,"协议"代表一系列特征,譬如鸭子协议是walk和swim,任何实现了鸭子协议的对象都可以当作鸭子,这个就是鸭子模型和协议。

再举个Python中更加常见的案例:“with”,上下文管理器。众所周知,在任何编程语言里面,文件处理都是基本的IO操作,都包含open和close两个操作,因为这两个操作是操作系统要求的。在操作系统里,每当打开一个文件,获取一个文件句柄后就会占用操作系统的资源,所以操作系统要求文件处理完后需要应用去close,释放掉文件句柄资源。然而现实情况是,开发者往往忘记close,最终导致资源泄漏问题频发。为了解决这个问题,Python使用with来进行上下文管理,在with的语句块结束后自动close,不再需要手动操作了,效率蹭蹭地上去。上下文管理器示例如下:

上下文管理器简单示例

在上面这个例子中,在with语句中进行open操作,然后调用read方法,最后并没有显示调用close,但不存在资源释放问题,因此with结束后会自动调用了close。那么with的底层原理是什么?类比鸭子模型介绍中关于协议的概念:

协议(Protocol)则是一种约定或契约,描述了对象应该具有的方法和属性。在Python中,协议是一种非正式的接口定义方式,它没有严格的语法要求,只需确保对象实现了协议中定义的方法和属性即可。协议允许我们根据对象的行为来定义接口,而不依赖于具体的类或类型。使用协议,我们可以通过定义一个适当的接口来描述对象的行为,而不仅仅依赖于继承关系。这样,不同的对象可以来自不同的类,但只要它们实现了相同的协议,我们就可以在代码中使用它们。
Python中的一些常见协议包括可迭代协议(Iterable Protocol)、可调用协议(Callable Protocol)和上下文管理器协议(Context Manager Protocol)等。这些协议定义了一组方法或属性,用于描述对象应该具备的行为。

我们回到刚才的示例中,在with中对应的是实现上下文管理器协议__enter__方法和__exit__方法,换句话说,只要一个类具备__enter__方法和__exit__方法,就可以使用with管理,with开始时调用__enter__方法,结束时自动调用__exit__方法,示例代码如下:

自定义具备__enter__方法和__exit__方法的Person类

运行下,查看结果:

运行结果

在这个例子中,我们可以看到没有显示调用Person的__enter__方法和__exit__方法,由with自动调用了,因此对于资源释放类,资源释放的操作可以放到__exit__方法中,这样配合with语句使用会方便很多,也降低出错的概率。

总结一下,在Python中,鸭子模型指的是我们关注对象的行为(方法和属性)而不是其具体的类型。如果一个对象具有我们所期望的行为,我们就可以将其视为满足我们的需求,而无需关注其实际的类型。这种灵活性使得在Python中编写可重用和灵活的代码变得更加容易。例如,如果我们编写了一个需要迭代对象的函数,我们只关心对象是否具有__iter__()方法,而不关心它是否是一个具体的列表、元组或集合。

总之,鸭子模型让我们专注于对象的行为而不是其具体类型,在编写灵活、可重用的代码时非常有用。

以上就是“Python中的鸭子模型”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值