python的多态
什么是多态多态Polymorphism是指同一操作如方法调用作用于不同对象时可以有不同的实现产生不同的结果。例如len()函数可以用于字符串、列表、元组等不同类型但都能正确返回长度。鸭子类型的定义鸭子类型的名称来源于一句谚语“如果它走起路来像鸭子、叫起来也像鸭子那么它就是鸭子。”在编程中这意味着我们不关心一个对象是什么类型类只关心它有没有我们需要的方法或属性。只要对象实现了某个方法就可以被调用而不需要显式继承自某个基类。简单举例def make_sound(animal): animal.quack() # 调用对象的 quack 方法class Duck: def quack(self): print(嘎嘎嘎) class Person: def quack(self): print(我模仿鸭子叫) class Dog: def bark(self): print(汪汪汪)make_sound(Duck()) # 输出嘎嘎嘎 make_sound(Person()) # 输出我模仿鸭子叫 # make_sound(Dog()) # 报错Dog 对象没有 quack 方法Duck和Person都有quack()方法所以它们都可以传给make_sound即使它们之间没有继承关系。这就是鸭子类型 ——只要会“叫”我就当它是鸭子。常见的鸭子类型应用Python 中有很多内置的“协议”它们都是鸭子类型的体现迭代器协议只要对象实现了__iter__()和__next__()方法就可以用于for循环。上下文管理器协议只要对象实现了__enter__()和__exit__()方法就可以用于with语句。序列协议只要对象实现了__getitem__()和__len__()就可以像列表一样被索引和切片。1、迭代器协议class Counter: 一个简单的计数器从 start 数到 end包含 end def __init__(self, start, end): self.current start # 当前值 self.end end # 结束值 def __iter__(self): # __iter__ 返回迭代器对象本身因为自身已经实现了 __next__ return self def __next__(self): if self.current self.end: raise StopIteration # 没有更多元素时抛出异常 else: # 返回当前值并将 current 加 1为下一次迭代做准备 value self.current self.current 1 return value # 使用 for 循环遍历 Counter 对象 for num in Counter(1, 5): print(num)工作原理详解创建迭代器Counter(1, 5)创建了一个对象其内部属性current初始为 1end为 5。进入for循环Python 首先调用iter(Counter(1,5))即对象的__iter__方法该方法返回自身因为自身就是迭代器。反复获取值循环内部不断调用迭代器的__next__()方法每次返回current的当前值并递增直到current end时抛出StopIteration。停止循环for捕获到StopIteration后自动退出循环。2、上下文管理器协议class MyContext: def __enter__(self): print(进入上下文) return self # 可以返回任何对象通过 as 绑定 def __exit__(self, exc_type, exc_val, exc_tb): print(退出上下文) # 如果返回 True则抑制异常不向外抛出 # 如果返回 False 或不返回默认 None异常会继续传播 return False with MyContext() as mc: print(在上下文中执行) # 如果这里发生异常__exit__ 会被调用除了自定义类Python 还提供了contextlib模块可以用更简洁的方式创建上下文管理器例如contextmanager装饰器。上下文管理器协议由两个特殊方法组成__enter__(self)在进入with代码块时被调用。它的返回值可以通过as关键字绑定到with语句中指定的变量。__exit__(self, exc_type, exc_val, exc_tb)在退出with代码块时被调用无论是否发生异常。该方法可以用于清理资源如关闭文件、释放锁等并且可以通过返回值来控制异常是否被传播。3、序列协议序列协议是指对象通过实现特定的方法使其能够像内置序列如列表、元组一样支持索引访问、切片、迭代等操作。核心的两个方法是__getitem__(self, key)定义通过索引key获取元素的行为。key可以是整数也可以是切片对象slice。__len__(self)返回序列中元素的个数用于支持len()函数和某些隐式长度判断。实现了这两个方法后对象就可以使用obj[i]进行索引访问使用obj[start:stop:step]进行切片被for循环迭代被in运算符用于成员检测被reversed()等函数处理如果实现得当。class MyRange: def __init__(self, start, end): self.start start self.end end def __len__(self): # 返回序列长度 return max(0, self.end - self.start) def __getitem__(self, key): # 处理索引和切片 if isinstance(key, int): # 检查索引是否越界 if key 0 or key len(self): raise IndexError(索引超出范围) return self.start key elif isinstance(key, slice): # 处理切片获取切片的起始、停止、步长 start, stop, step key.indices(len(self)) # 根据切片参数生成新的 MyRange 对象 new_start self.start start new_end self.start stop # 注意这里为了简化假设步长为1实际应支持任意步长 if step ! 1: # 简单的实现返回一个列表或者可以扩展 MyRange 支持步长 return [self.start i for i in range(start, stop, step)] return MyRange(new_start, new_end) else: raise TypeError(索引必须是整数或切片) # 测试 r MyRange(2, 8) # 代表 2,3,4,5,6,7 # 索引访问 print(r[0]) # 输出 2 print(r[3]) # 输出 5 # print(r[10]) # 会抛出 IndexError # 切片 print(r[1:5]) # 输出 MyRange(3,7) (包含 3,4,5,6) print(r[1:5:2]) # 输出 [3,5] (因为步长不是1返回了列表) # 支持 len() print(len(r)) # 输出 6 # 支持迭代 for num in r: print(num, end ) # 输出 2 3 4 5 6 7 # 支持 in print(4 in r) # True print(10 in r) # False说明__len__返回序列长度使len(r)正常工作。__getitem__当key是整数时计算并返回对应元素并进行边界检查。当key是切片时使用slice.indices(len(self))将切片参数规范化到有效范围内然后根据需要返回新的序列或列表。本例中当步长为1时返回新的MyRange对象否则返回列表以展示灵活性。其他类型抛出TypeError。python的多态与JAVA多态的区别在 Java、C 等静态类型语言中要实现多态通常需要继承同一个父类或实现同一个接口。编译器强制检查类型。而在 Python 中我们只需要保证对象有对应的方法即可无需继承。这带来了极大的灵活性但也要求开发者遵循约定即确保对象真的有该方法否则会在运行时抛出AttributeError。

相关新闻

OpenClaw+GraphRAG实战:让AI具备长期记忆与复杂逻辑推理

OpenClaw+GraphRAG实战:让AI具备长期记忆与复杂逻辑推理

文章目录引言:你的AI是不是也有"金鱼病"?OpenClaw的记忆系统:从"记事本"到"档案馆"三级记忆架构解析第一层:工作记忆(Short-term)第二层:长期记忆(Lo…

2026/7/5 8:11:14 阅读更多 →
打破浏览器的“沙盒”围墙:跨域问题的成因与全栈解决方案

打破浏览器的“沙盒”围墙:跨域问题的成因与全栈解决方案

打破浏览器的“沙盒”围墙:跨域问题的成因与全栈解决方案在现代 Web 开发中,“跨域”(Cross-Origin)是每一位前后端开发者都会遇到的拦路虎。浏览器控制台里红色的 Access-Control-Allow-Origin 报错,往往意味着数据请…

2026/7/4 15:23:47 阅读更多 →
实测对比:ToDesk、向日葵、AnyDesk、RustDesk、Splashtop五大主流远程软件谁最强?2026年选购指南

实测对比:ToDesk、向日葵、AnyDesk、RustDesk、Splashtop五大主流远程软件谁最强?2026年选购指南

实测对比:ToDesk、向日葵、AnyDesk、RustDesk、Splashtop五大主流远程软件谁最强?2026年选购指南 前言 最近,随着工作方式的变化,尤其是远程办公和跨设备协作的需求越来越大,我发现自己也越来越依赖远程控制软件。作…

2026/7/6 0:28:40 阅读更多 →

最新新闻

ai模特识别能力如何?商用图片批量生成平台横评与实用对比

ai模特识别能力如何?商用图片批量生成平台横评与实用对比

随着ai模特识别技术持续进步,电商行业的商品展示效率和多样性得以大幅提升。作为从业者,我实际体验多款平台后发现,商用级AI图片处理工具正在逐步成为电商图片生产新基建。 作图鸟详解 作图鸟地址:https://www.zuotuniao.com/?…

2026/7/6 15:52:49 阅读更多 →
Hermes Studio 安全配置最佳实践:认证、授权与数据保护

Hermes Studio 安全配置最佳实践:认证、授权与数据保护

Hermes Studio 安全配置最佳实践:认证、授权与数据保护 【免费下载链接】hermes-studio Web dashboard for Hermes Agent — multi-platform AI chat, session management, scheduled jobs, usage analytics 项目地址: https://gitcode.com/gh_mirrors/he/hermes…

2026/7/6 15:52:49 阅读更多 →
Fashion-MNIST实战指南:从传统MNIST到现代计算机视觉的进阶之路

Fashion-MNIST实战指南:从传统MNIST到现代计算机视觉的进阶之路

Fashion-MNIST实战指南:从传统MNIST到现代计算机视觉的进阶之路 【免费下载链接】fashion-mnist A MNIST-like fashion product database. Benchmark :point_down: 项目地址: https://gitcode.com/gh_mirrors/fa/fashion-mnist 在机器学习的演进历程中&…

2026/7/6 15:48:45 阅读更多 →
深度解析Marp插件开发:5大进阶实战技巧与架构设计指南

深度解析Marp插件开发:5大进阶实战技巧与架构设计指南

深度解析Marp插件开发:5大进阶实战技巧与架构设计指南 【免费下载链接】marp The entrance repository of Markdown presentation ecosystem 项目地址: https://gitcode.com/gh_mirrors/mar/marp Marp作为现代化的Markdown演示文稿生态系统,为开发…

2026/7/6 15:48:45 阅读更多 →
Lightpanda:9倍内存效率的革命性无头浏览器,专为AI时代打造

Lightpanda:9倍内存效率的革命性无头浏览器,专为AI时代打造

Lightpanda:9倍内存效率的革命性无头浏览器,专为AI时代打造 【免费下载链接】browser Lightpanda: the headless browser designed for AI and automation 项目地址: https://gitcode.com/GitHub_Trending/browser32/browser 在AI代理、自动化测试…

2026/7/6 15:46:42 阅读更多 →
如何在3分钟内用Open-Sora免费创作专业级AI视频:完整指南

如何在3分钟内用Open-Sora免费创作专业级AI视频:完整指南

如何在3分钟内用Open-Sora免费创作专业级AI视频:完整指南 【免费下载链接】Open-Sora Open-Sora: Democratizing Efficient Video Production for All 项目地址: https://gitcode.com/GitHub_Trending/op/Open-Sora 想象一下,只需输入几个简单的文…

2026/7/6 15:44:40 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻