【python高级编程教程】笔记(python教程、python进阶)第三节:(1)多态与鸭子类型(Polymorphism and Duck Typing)

参考文章1:【比刷剧还爽】清华大佬耗时128小时讲完的Python高级教程!全套200集!学不会退出IT界!

参考文章2:清华教授大力打造的Python高级核心技术!整整100集,强烈建议学习(Python3高级编程、异步IO并发编程)

2023python进阶天花板教程(顾安老师亲制) ①【配套资料】:
链接:https://pan.baidu.com/s/1Uc9r5kVGdaoC6PSTKGxdTA?pwd=2ynm 提取码:2ynm
②【配套课件+代码笔记】Python基础进阶100集!面向对象+魔法函数+元类编程+并发编程丨图灵Python教育丨顾安老师√网盘链接:https://pan.baidu.com/s/12ghyQx-zKHU-IZXIrYInkg?pwd=j915
提取码:j915
③【课件+源码】【Python并发编程】协程异步IO(asyncio)的介绍与使用-图灵Python教育“顾安老师”赞助提供√网盘链接:https://pan.baidu.com/s/1ztwnBYdrKdw6u6DWCHwDmg?pwd=kpyv,提取码:kpyv

仅供个人学习研究!文件较多,易失效!若无法访问,请及时向我反馈~

文章目录

  • 1. 多态与鸭子类型
    • 什么是鸭子类型?
    • 多态 vs 鸭子类型
      • 多态
      • 鸭子类型
    • 可迭代对象和鸭子类型(鸭子类型实现自定义可迭代对象:通过实现 `__iter__` 或者 `__getitem__` 方法)

1. 多态与鸭子类型

什么是鸭子类型?

“鸭子类型”(Duck typing)是一种编程概念,它更注重对象的行为,而不是对象所属的类型。这个词源自James Whitcomb Riley的名言:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

在Python中,"鸭子类型"指的是对对象的处理方式:如果一个对象实现了某个方法或者特性,那么就可以认为它就是那个类型。也就是说,一个对象的类型并不取决于它继承自什么类,或者实现了什么接口,而是取决于它有什么行为(或者说,具备哪些能力)。

例如,你可能需要一个可迭代对象。在Python中,任何定义了 __iter____getitem__ 方法的对象都可以被视为可迭代的。这意味着,你并不关心对象是否是列表、元组或者其他什么类型,只要它表现得像可迭代对象就行。

多态 vs 鸭子类型

多态和鸭子类型都是面向对象编程的概念,它们允许在一定程度上将不同类型的对象以相同的方式处理。

多态

多态 是指从相同的接口实现不同的行为。在使用多态时,通常会定义一个父类(或接口),并且会有多个子类继承这个父类,并重写父类的方法。这样,当你对父类对象调用这些方法时,实际上执行的是子类中重写的版本。

例如:

class Bird:def fly(self):raise NotImplementedError("Subclass must implement abstract method")class Sparrow(Bird):def fly(self):return "Sparrow flying"class Penguin(Bird):def fly(self):return "Penguin can't fly"birds = [Sparrow(), Penguin()]for bird in birds:print(bird.fly())

运行结果:
在这里插入图片描述

在以上代码中,Bird 类有一个 fly 方法,但它需要在子类 SparrowPenguin 中被重写。当我们遍历鸟类列表并调用 fly 方法时,Python会自动找到并调用每种鸟类的 fly 方法。这就是多态的体现。

鸭子类型

鸭子类型 则是另一种处理多类型问题的方式。在Python中,如果一个对象像鸭子一样走路、像鸭子一样叫,那么我们就可以把它当作鸭子。换句话说,我们不关心对象的实际类型,只关心它是否有我们需要的方法或属性。

例如:

class Duck:def quack(self):return "Duck quacks"class Dog:def quack(self):return "Dog pretends to quack"def make_it_quack(animal):print(animal.quack())duck = Duck()
dog = Dog()make_it_quack(duck)  # Outputs: Duck quacks
make_it_quack(dog)   # Outputs: Dog pretends to quack

在这个例子中,make_it_quack 函数接受一个动物对象作为参数,并调用它的 quack 方法。这个函数并不关心传入的对象是什么类型,只要它有一个 quack 方法就行。这就是鸭子类型的体现。

可迭代对象和鸭子类型(鸭子类型实现自定义可迭代对象:通过实现 __iter__ 或者 __getitem__ 方法)

在Python中,可迭代对象是指任何可以返回一个迭代器的对象。换句话说,任何包含__iter__()方法或者__getitem__()方法(只要传入递增的整数能够访问到元素)的对象都被视为可迭代对象。常见的如列表、元组、字符串、字典和文件等。

例如,我们可以通过for循环遍历一个列表:

my_list = [1, 2, 3]
for i in my_list:print(i)

在上面的例子中,列表 my_list 就是一个可迭代对象,我们可以使用for循环来遍历它。

这里的"可迭代对象"概念就涉及到了鸭子类型。在Python中,你并不需要知道一个对象具体是什么类型,只需要知道它能做什么。如果它表现得像一个可迭代对象(也就是说,它有 __iter__ 或者 __getitem__ 方法),那么你就可以把它当作可迭代对象使用。

这就意味着,你可以定义自己的类型,只要它实现了 __iter__ 或者 __getitem__ 方法,它就能被当作可迭代对象。例如:

class MyIterable:def __init__(self, data):self.data = datadef __iter__(self):return iter(self.data)my_iterable = MyIterable([1, 2, 3])
for i in my_iterable:print(i)

在这里插入图片描述

在这个例子中,我们定义了一个新的类型 MyIterable,它接受一个列表,并通过 __iter__ 方法返回这个列表的迭代器。尽管 MyIterable 不是内置的列表、元组或字符串等类型,但只要它实现了 __iter__ 方法,就可以被当作可迭代对象使用。这就是鸭子类型的体现:看起来像鸭子,走起路来像鸭子,那么它就是鸭子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/270305.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 开发图形界面程序

用 Python 语言开发图形界面的程序,有2种选择: Tkinter 基于Tk的Python库,这是Python官方采用的标准库,优点是作为Python标准库、稳定、发布程序较小,缺点是控件相对较少。 PySide2/PySide6 基于Qt 的Python库&#x…

JMeter VS RunnerGo :两大主流性能测试工具对比

说起JMeter,估计很多测试人员都耳熟能详。它小巧、开源,还能支持多种协议的接口和性能测试,所以在测试圈儿里很受欢迎,也是测试人员常用的工具,不少企业也基于JMeter建立起自己的自动化测试能力,提升工作效…

VMware虚拟机安装Linux

1.新建虚拟机 2. 安装操作系统 等待 选择中文 点软件选择 选择下面的GNOME桌面 禁用KDUMP 点进安装位置,点完成就可以了 网络连接,右上角打开 开始安装,输入ROOT密码,创建用户 点击重启,等待 重启完成之后出现下面的界…

javaWebssh在线授课辅导系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh在线授课辅导系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

PaddleOCR CPU 文本文字识别 docker部署

需求: 需要把所有滑块图片的数据文字提取出来 启动服务 mkdir paddle cd paddle docker run -itd --name ppocr -v $PWD:/paddle --networkhost -it registry.baidubce.com/paddlepaddle/paddle:2.1.3-gpu-cuda10.2-cudnn7 /bin/bash docker exec -it ppocr bash …

重装显卡驱动记录

重装显卡驱动记录 任务记录现状描述执行情况 任务 晚上回来,开电脑,发现总是进不去系统(这个情况我经常见),但偶尔进系统,识别不了我的外接屏(这个第一次见)。来来回回重启了1h多了…

JVM内部世界(内存划分,类加载,垃圾回收)

💕"Echo"💕 作者:Mylvzi 文章主要内容:JVM内部世界(内存划分,类加载,垃圾回收) 关于JVM的学习主要掌握三方面: JVM内存区的划分类加载垃圾回收 一.JVM内存区的划分 当一个Java进程开始执行时,JVM会首先向操作系统申…

18 easy 104. 二叉树的最大深度

方法1:深度优先遍历 //给定一个二叉树 root ,返回其最大深度。 // // 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 // // // // 示例 1: // // // // // // //输入:root [3,9,20,null,null,15,7…

16:00面试,16:06就出来了,问的问题过于变态了。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到2月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)

💯 博客内容:【茶话数据结构】查找最短路径——Dijkstra算法详解 😀 作  者:陈大大陈 🦉所属专栏:数据结构笔记 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实…

数据结构之顺序表及其实现!

目录 ​编辑 1. 顺序表的概念及结构 2. 接口的实现 2.1 顺序表的初始化 2.2 检查顺序表容量是否已满 2.3 顺序表的尾插 ​编辑 2.4 顺序表的尾删 2.5 顺序表的头插 2.6 顺序表的头删 2.7 顺序表在pos位置插入 2.8 顺序表在pos位置删除 2.9 顺序表的查找 2.10 顺…

【硬件设计】光耦HCNR200基本原理及应用(资料摘抄)

【仅作自学记录,不出于任何商业目的。如有侵权,请联系删除,谢谢!】 本文摘抄翻译自: https://docs.broadcom.com/wcs-public/products/application-notes/application-note/331/6/av02-1333en-an_5394-16jul10.pdfhtt…

静态住宅代理IP选择攻略

静态住宅代理IP,是一种在网络通信过程中提供固定IP地址的代理服务。与动态代理IP相比,静态代理IP提供的是持久且不变的IP地址。这种稳定性使得静态代理IP在需要长期稳定网络身份的场景中,如跨境电商/社媒养号、网络监控、品牌保护、长期数据爬…

【web安全】实战 批量横扫springboot命令执行漏洞

天命:这次目标批量横扫,但是没完全成功,也没完全失败 步骤1:磨刀准备 这次先针对漏洞来寻找目标,所以寻找这种 springboot 的目标 利用CVE漏洞,进行命令执行攻击 先找靶场训练一波,叠加反弹sh…

惯性导航 | 航迹推算与gazebo仿真

惯性导航 | 航迹推算与gazebo仿真 IMU数据进行短时间航迹推算代码gazebo中进行仿真测试 IMU数据进行短时间航迹推算 代码 声明一个用与 IMU积分的类 ,来实现 短时间内的航迹推算 类的名字叫 IMUIntegration 构造函数 有三个变量进行私有变量初始化 重力、初始陀螺…

制作一个简单的HTML个人网页

制作一个简单的HTML个人网页 1.1 硬件1.1.1 一台电脑1.1.2 配置要求 1.2 系统1.3 软件 二、制作一个简单的HTML个人网页1.创建一个HTML网页1.1 新建文本文档1.2 另存文本文档1.3 命名为index.html 2.编写HTML代码2.1 打开HTML2.2 复制HTML代码2.3 粘贴HTML代码2.4 保存HTML 3.预…

Map集合体系——遍历,HashMap,TreeMap,LikedHashMap

认识Map集合 Map集合体系特点 方法 代码示例 package com.zz.Map;import java.util.*;public class Test {public static void main(String args[]){Map<String, Integer> map new HashMap <>();//经典代码&#xff0c;按照键 无序 不重复 无索引map.put("…

阻塞队列、生产者消费者模型、阻塞队列的模拟实现等干货

文章目录 &#x1f490;生产者消费者模型&#x1f490;模拟实现阻塞队列&#x1f4a1;注意点一&#x1f4a1;注意点二 阻塞队列是一种“特殊”的数据结构&#xff0c;但是也遵循队列的“先进先出”特性&#xff0c;它的特殊在于&#xff1a; 阻塞队列的两个特性&#xff1a; 1…

学习基于 JavaScript 语言 的计算机界三大神书”之一 ——SICP

如何阅读“计算机界三大神书”之一 ——SICP 《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动全世界大学计算…

C switch 语句

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case&#xff0c;且被测试的变量会对每个 switch case 进行检查。 语法 C 语言中 switch 语句的语法&#xff1a; switch(expression){case constant-expression :statement(s);break; /* 可选的 */ca…