【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 方法,但它需要在子类 Sparrow 和 Penguin 中被重写。当我们遍历鸟类列表并调用 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__ 方法,就可以被当作可迭代对象使用。这就是鸭子类型的体现:看起来像鸭子,走起路来像鸭子,那么它就是鸭子。
相关文章:
【python高级编程教程】笔记(python教程、python进阶)第三节:(1)多态与鸭子类型(Polymorphism and Duck Typing)
参考文章1:【比刷剧还爽】清华大佬耗时128小时讲完的Python高级教程!全套200集!学不会退出IT界! 参考文章2:清华教授大力打造的Python高级核心技术!整整100集,强烈建议学习(Python3…...
学习JAVA的第十五天(基础)
目录 数据结构 二叉树 二叉查找树 平衡二叉树 红黑树 Set系列集合 HashSet集合 LinkedHashSet集合 TreeSet集合 前言:学习JAVA的第十四天(基础)-CSDN博客 数据结构 二叉树 元素:结点&am…...
LVS四层负载均衡集群
简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访…...
【pyinstaller打包记录】程序使用多进程,打包后,程序陷入死循环
简介 PyInstaller 是一个用于将 Python 程序打包成可执行文件(可执行程序)的工具。它能够将 Python 代码和其相关的依赖项(包括 Python 解释器、依赖的模块、库文件等)打包成一个独立的可执行文件,方便在不同环境中运行…...
MAC | linux | SSH 密钥验证
SSH密钥登陆过程 客户端通过ssh-keygen生成自己的公钥和私钥。手动将客户端的公钥放入远程服务器的指定位置。客户端向服务器发起 SSH 登录的请求。服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。客户端收到服务器发来…...
【AI Agent系列】【MetaGPT多智能体学习】3. 开发一个简单的多智能体系统,兼看MetaGPT多智能体运行机制
本系列文章跟随《MetaGPT多智能体课程》(https://github.com/datawhalechina/hugging-multi-agent),深入理解并实践多智能体系统的开发。 本文为该课程的第四章(多智能体开发)的第一篇笔记。主要记录下多智能体的运行…...
机器学习-面经(part7、无监督学习)
机器学习面经系列的其他部分如下所示: 机器学习-面经(part1) 机器学习-面经(part2)-交叉验证、超参数优化、评价指标等内容 机器学习-面经(part3)-正则化、特征工程面试问题与解答合集机器学习-面经(part4)-决策树共5000字的面试问题与解答…...
teknoparrot命令行启动游戏
官方github cd 到teknoparrot解压目录 cd /d E:\mn\TeknoParrot2_cp1\GameProfiles启动游戏 TeknoParrotUi.exe --profile游戏配置文件游戏配置文件位置/UserProfiles,如果UserProfiles文件夹里没有那就在/GameProfiles,在配置文件里将游戏路径加入之间,或者打开模拟器设置 …...
停止Tomcat服务的方式
运行脚本文件停止 运行Tomcat的bin目录中提供的停止服务的脚本文件 关闭命令 # sh方式 sh shutdown.sh# ./方式 ./shutdown.sh操作步骤 运行结束进程停止 查看Tomcat进程,获得进程id kill进程命令 # 执行命令结束进程 kill -9 65358 操作步骤 注意 kill命令是…...
多线程相关面试题(2024大厂高频面试题系列)
1、聊一下并行和并发有什么区别? 并发是同一时间应对多件事情的能力,多个线程轮流使用一个或多个CPU 并行是同一时间动手做多件事情的能力,4核CPU同时执行4个线程 2、说一下线程和进程的区别? 进程是正在运行程序的实例ÿ…...
mysql 时间精度问题
timestamp到2038年,还有14年时间,一个系统如果能活到那一刻也是相当不错了。 这里先看一下个datetime的问题,下面的插入数据的时间戳是2024-03-06 21:20:50.839 INSERT INTO psi_io_balance ( id, as_id, bill_date, order_id, busi_type, direction, c…...
基于python的爬虫原理和管理系统实现(代码下载)
Python实现爬虫的原理如下: 发送请求:使用Python中的库,如Requests或urllib,向目标网站发送HTTP请求,获取网页的内容。 解析网页:使用Python中的库,如BeautifulSoup或lxml,对获取的…...
IOS 设置UIViewController为背景半透明浮层弹窗,查看富文本图片详情
使用场景:UIViewController1 打开 UIViewController2(背景半透明弹窗) 案例:打开富文本网页<img>图片的url查看图片详情 WKWebView WKNavigationDelegate代理方法设置js代码点击事件 ///注册添加图片标签点击js方法 - …...
网络层介绍
网络层是OSI模型中的第三层,也称为网络协议层。它主要负责在源主机和目标主机之间提供数据通信的路径选择和控制。网络层通过使用源和目标主机的网络地址来实现数据包的路由和转发。 以下是网络层的一些主要功能: 路由选择:网络层使用路由选…...
springboot/ssm酒店客房管理系统Java在线酒店预约预定平台web
springboot/ssm酒店客房管理系统Java在线酒店预约预定平台web 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:…...
分布式测试插件 pytest-xdist 使用详解
使用背景: 大型测试套件:当你的测试套件非常庞大,包含了大量的测试用例时,pytest-xdist可以通过并行执行来加速整体的测试过程。它利用多个进程或计算机的计算资源,可以显著减少测试执行的时间。高计算资源需求&#…...
【S32K3 MCAL配置】-1.1-GPIO配置及其应用-点亮LED灯(基于MCAL)
目录(共13页精讲,手把手教你S32K3从入门到精通) 实现的架构:基于MCAL层 前期准备工作: 1 创建一个FREERTOS工程...
【软件工程】软件工程定义、软件危机以及软件生命周期
🌸博主主页:釉色清风🌸文章专栏:软件工程🌸 今日语录:What matters isn’t how others think of your ambitions but how fervently you cling to them. 软件工程系列,主要根据老师上课所讲提及…...
24计算机考研深大经验分享(计算机专业考研综合安排)
文章目录 背景科目选择高数选课一轮二轮冲刺阶段 线代一轮二轮 概率论计算机学科专业基础408数据结构计算机组成原理操作系统计算机网络总结 英语政治 末言 背景 首先贴一下初试成绩。这篇分享主要是给零基础的同学使用的,基础好的同学可以自行了解补充一下…...
【知识整理】MySQL数据库开发设计规范
一、规范背景与目的 MySQL数据库与 Oracle、 SQL Server 等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。 本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计。在数据库变更和处理…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
