【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等技术人员做出适合线上业务的数据库设计。在数据库变更和处理…...
RTKLIB源码解析(五)数据流融合:RINEX、RTCM、NMEA与接收机原始数据的协同处理
1. 多源GNSS数据流融合的核心挑战 在RTKLIB的实际应用中,处理来自不同数据源的GNSS观测数据时,开发者常会遇到三个关键问题:格式差异、时间基准不统一和数据质量参差不齐。以RINEX、RTCM、NMEA和接收机原始数据为例,这些数据源的…...
Flux Sea Studio 与Node.js全栈项目集成:打造在线海景艺术画廊
Flux Sea Studio 与Node.js全栈项目集成:打造在线海景艺术画廊 最近在做一个挺有意思的业余项目,想给喜欢海洋艺术的朋友们弄个在线画廊。这个画廊的特别之处在于,它不只是展示静态图片,而是能让用户自己动手,用文字描…...
DeOldify API速率限制:令牌桶算法实现每用户每小时1000次调用
DeOldify API速率限制:令牌桶算法实现每用户每小时1000次调用 1. 为什么需要API速率限制 在构建基于DeOldify的图像上色服务时,我们面临一个重要的技术挑战:如何公平合理地分配计算资源。深度学习模型推理需要消耗大量的GPU计算资源&#x…...
从潍坊一中赛题看算法竞赛中的数据类型陷阱与优化策略
1. 数据类型陷阱:从潍坊一中T1赛题看数值溢出问题 第一次参加算法竞赛的同学,90%都会在数据类型上栽跟头。就拿潍坊一中T1"揽月湖"这道题来说,表面是简单的数学表达式计算,实则是数据类型选择的经典案例。题目要求计算3…...
避坑指南:MTK DRM屏兼容中,那些容易让你“点不亮”的硬件与配置细节(附TP复位脚案例)
MTK DRM屏兼容开发实战:从硬件引脚到驱动配置的深度避坑指南 在MTK平台的多屏兼容开发中,工程师们常常会遇到屏幕"点不亮"的棘手问题。这类问题往往源于硬件连接、引脚配置或驱动编译选项中的细微疏忽。本文将结合真实案例,深入剖…...
使用 C++ 模拟 ShaderLanguage 的 swizzle
经常编写着色器的同学应该对 swizzle(重排)语法非常熟悉,方便又灵活,可以说是用过一次便回味无穷。 代码 vec4 color vec4(1.0, 0.5, 0.0, 1.0); vec3 rgb color.rgb; // { 1.0, 0.5, 0.0 } vec2 xy color.xy; …...
突破跨平台壁垒:Whisky让macOS高效运行Windows程序的颠覆性方案
突破跨平台壁垒:Whisky让macOS高效运行Windows程序的颠覆性方案 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 作为一名独立游戏开发者,李明曾因Mac无法运行…...
探索TinyEditor:400字节内的微型全能代码编辑器
探索TinyEditor:400字节内的微型全能代码编辑器 【免费下载链接】TinyEditor A functional HTML/CSS/JS editor in less than 400 bytes 项目地址: https://gitcode.com/gh_mirrors/ti/TinyEditor 在前端开发工具领域,TinyEditor以其极致精简的设…...
如何用tiny11builder打造轻量Windows 11系统:绕过硬件限制的完整指南
如何用tiny11builder打造轻量Windows 11系统:绕过硬件限制的完整指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 老旧电脑无法流畅运行Windows 11…...
Stable-Diffusion-v1-5-archive镜像免配置部署:7860端口直连实操手册
Stable-Diffusion-v1-5-archive镜像免配置部署:7860端口直连实操手册 想体验经典AI绘画的魅力,又不想折腾复杂的本地环境?今天,我们就来手把手教你如何通过一个预置好的镜像,零配置、一键式地启动Stable Diffusion v1…...
