鸭子类型是Python中一种独特的编程方式,指的是一种动态类型的概念(只要一只动物走路像鸭子,叫声像鸭子,那么它就可以被当做鸭子使用)。

这意味着在Python中,您可以使用多个不同的类对象来执行相同的操作,只要它们具有相同的方法和属性即可。

多态是面向对象的编程语言的三大特性(封装、继承、多态)之一,它指的是通过不同的对象表现出相同的行为方式。具有多态特性的语言可以将同一方法应用于不同的对象,从而可以通过不同的子类实现相同的接口来处理不同的行为。

比如,在Python中,动物类Animal有一个say()方法,而狗子类Dog和猫子类Cat分别重写了这个say()方法,并且可以使用相同的方法名称调用它来表现出不同的行为。

具体的代码如下:

class Animal:def say(self):print("我是一只动物,我会叫")class Cat(Animal):def say(self):print("我是一只猫,我是这样叫的:喵喵喵")class Dog(Animal):def say(self):print("我是一只猫,我是这样叫的:汪汪汪")animal = Cat()
animal.say()  # 喵喵喵animal = Dog()
animal.say()  # 汪汪汪

运行结果:

以上代码展示了如何使用多态实现“同一个方法在不同类中产生不同的结果”的效果。在该示例中,我们定义了一个 Animal 类,其中包含一个 say() 方法。然后我们创建了两个子类 Cat 和 Dog,这两个子类都重写了基类中的 say() 方法。

在测试代码中,我们首先将 animal 对象初始化为 Cat 类的一个实例。然后我们调用这个实例的 say() 方法,实际上调用了 Cat 类中重写后的 say() 方法,并打印出 "我是一只猫,我是这样叫的:喵喵喵"。然后,我们将 animal 对象重置为 Dog 类的一个实例,并再次调用它的 say() 方法,这次实际调用的是 Dog 类中重写后的 say() 方法,并打印出 "我是一只狗,我是这样叫的:汪汪汪"。

这个示例说明了,即使在基类中定义了一个方法,派生类也可以覆盖该方法并实现自己的逻辑。这是实现多态的一个非常基本且重要的原则。通过多态机制,我们可以写出更加灵活和易于扩展的程序。

接下来再看一下,把类当做变量的一个用法,这个是我之前没怎么关注过的:

class Cat(object):def say(self):print("我是一只猫,喵喵喵")class Dog(object):def say(self):print("我是一只猫,汪汪汪")animal_list = [Cat, Dog] for animal in animal_list:animal().say()

以上代码中,第11行中的Cat, Dog在列表中都会被当做变量,只有在第14行被实例化之后,才会明确Cat, Dog是某个class类。

最近准备组建各种打卡学习,有兴趣的小伙伴可以微信(xiaobotester)私聊一起学习。

Python中鸭子类型与多态介绍相关推荐

  1. Python中的类型判断方法介绍

    一.介绍 Python中判断变量类型可以使用以下2种方法: isinstance() type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关系: isinstance() 会认为 ...

  2. Python中的继承和多态

    本文以生活中的基础现象为切入点,主要介绍了Python基础中继承和多态,包括单继承.多继承的语法.多态常见的 "鸭子类型". 以及如何重写父类的方法都做了详细的讲解. 一.继承的介 ...

  3. java实现鸭子类型_鸭子类型和多态

    鸭子类型与多态 内容鸭子类型和多态 抽象基类(abc模块) 使用isinstance和type的区别 类属性和实例属性 类属性和实例属性查找顺序 Python对象的自省机制 super函数 鸭子类型 ...

  4. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  5. 在Python中检查类型的规范方法是什么?

    检查给定对象是否为给定类型的最佳方法是什么? 如何检查对象是否从给定类型继承? 假设我有一个对象o . 如何检查是否为str ? #1楼 前往雨果: 您可能是说list而不是array ,但这指向类型 ...

  6. python流程控制语句-Python中流程控制语句的详细介绍

    除了刚才介绍的while语句之外,Python也从其他语言借鉴了其他流程控制语句,并做了相应改变.Python中流程控制语句的详细介绍 4.1 ifStatements 或许最广为人知的语句就是if语 ...

  7. php有lambda表达式吗,Python中lambda表达式的简单介绍(附示例)

    本篇文章给大家带来的内容是关于Python中lambda表达式的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:匿名函数的定义 lambda parameter ...

  8. chatgpt赋能python:Python中开区间和闭区间的介绍

    Python中开区间和闭区间的介绍 在Python编程中,经常需要使用区间(range)对象.区间对象是Python中自带的一种数据类型,它表示一系列连续的整数.Python中的区间对象支持开区间和闭 ...

  9. chatgpt赋能python:Python中的s.len()方法介绍

    Python中的s.len()方法介绍 Python中有各种字符串处理方法,其中s.len()方法是一个重要的方法之一.s.len()返回一个字符串s的长度.这是一个非常基本的方法,但是在很多情况下都 ...

最新文章

  1. 【kissfft】使用过程中的一些坑总结
  2. 一起谈.NET技术,一句代码实现批量数据绑定[下篇]
  3. IBatis.Net学习笔记六--再谈查询
  4. scrapy 中不同页面的拼接_scrapy官方文档提供的常见使用问题
  5. 从 Windows 切换到 Mac,不能错过这9条Tips
  6. VTK:Math之PerpendicularVector
  7. 说说 ES6 的 let 指令
  8. 第三章——jXLS Excel标记
  9. SAP CRM IBASE头部字段valid from和valid to的填充逻辑
  10. 我的Java设计模式-原型模式
  11. 感恩节日海报设计模板|简洁优雅的花卉主题海报
  12. 热点账户高并发解决方案
  13. iphone用计算机显示器,如何将iPhone屏幕投射到电脑上
  14. html加密文件怎么解密,加密文件如何解密?原理是什么?
  15. 湖人VS爵士!!科比4月14日最后一战,本赛季最高得分!狂得60分!!完美大逆转!!!...
  16. Python | 打印三角形图案(educoder)
  17. Debian系linux配置wifi连接|笔记本
  18. 关于Windows的dns修复
  19. ublox center获取RTK卫星数据
  20. 深入分析linux内核的内存分配函数devm_kzalloc

热门文章

  1. window.print 打印页面指定区域
  2. 看似巧妙设计,细品怪怪的
  3. 短信验证码(短信接口:阿里云
  4. 集合(list接口、迭代器)
  5. 为什么有钱人越来越有钱,99%的上班族都不知道的秘密!!
  6. 自制拖把机器人_Veniibot N1一款能自己洗拖布的机器人
  7. C语言关于windows下清屏
  8. 基于.NetCore开发博客项目 StarBlog - (15) 生成随机尺寸图片
  9. [附源码]JAVA+ssm农产品追溯系统设计与实现(程序+Lw)
  10. 电子白板简单实现delphi