【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 = data

    def __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.mfbz.cn/a/434661.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

集成算法(随机森林,AdaBoost,Xgboost,Stacking模型)

目录 一、前言 二、Bagging模型 三、Boosting模型 四、Stacking模型 五、总结 一、前言 集成算法(Enseamable learning) 集成算法一般考虑树模型,KNN就不太适合 目的:让机器学习效果更好,单个不好,一起…

【力扣白嫖日记】626.换座位

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 626.换座位 表:Seat 列名类型idintstudentvarchar id 是该表的主键(唯一值&#xf…

Golang各版本的GC详解

go v1.3的标记清除法 清除的第一步:stw将可达对象标记删除未被标记对象 go v1.5三色标记法 从根节点出发,将下一个节点遍历为灰色,放入灰色集合中遍历灰色节点集合,把灰色能到达的节点标记为灰色,把自身标记为黑色&a…

UniSA: Unified Generative Framework for Sentiment Analysis

文章目录 UniSA:统一的情感分析生成框架文章信息研究目的研究内容研究方法1.总体架构图2.基准数据集SAEval3.Task-Specific Prompt4.Modal Mask Training5.Pre-training Tasks5.1Mask Context Modeling5.2Sentiment Polarity Prediction5.3Coarse-grained Label Con…

latex使用\rm将部分公式或者部分单词设置为正体

在LaTeX中,\rm 是用于设置文字为 “Roman” 字体的命令。这里的 “Roman” 字体通常指的是默认的文本字体,也就是没有特意设置为斜体或粗体的普通字体。然而,\rm 并不总是表示特定的字体样式,而是依赖于当前文档或环境的设置。 在…

TIA博途中安装和更新HSP硬件支持包的具体方法示例

TIA博途中安装和更新HSP硬件支持包的具体方法示例 下面介绍2种方法,大家可根据自己实际的情况来选择适合自己的方法。 方法1: 参考以下链接中的内容: 如何TIA博途中更新HSP硬件目录? 方法2:

力扣515. 在每个树行中找最大值(BFS,DFS)

Problem: 515. 在每个树行中找最大值 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:BFS 套用BFS模板,直接在遍历树的某一层时将当前层的最大值存入数组中 思路2:DFS 回溯思想,在递归时不断更新可选列表(根据…

(C语言)深入理解指针2之野指针与传值与传址与assert断言

(C语言)深入理解指针1基础:http://t.csdnimg.cn/iGA3V 前面我们了解了指针的一些基础知识,下面我们进行进一步的指针学习 目录 1. 野指针 6.1 野指针成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间释放 6.2 如何…

基于JavaWEB SpringBoot婚纱影楼摄影预约网站设计和实现

基于JavaWEB SSM SpringBoot婚纱影楼摄影预约网站设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

Git快速上手二

对Git命令的深入理解快速上手Git(包含提交至GitHub和Gitee)-CSDN博客 1.5 分支操作 1.5.1 分支原理 系统上线后,又要修改bug,又要开发新的功能。 由于新功能没有开发完,所以需要建立分支,一边修改bug,一边开发新功能,最终合并. 1.5.2 分支实操 创建…

每日一题 — 有效三角形的个数

611. 有效三角形的个数 - 力扣(LeetCode) 思路: 双指针思想,先将数据排序 然后先固定最大的数Max,也就是数组最后的数再定义一左一右两个下标 left 、 right,当这个值相加大于最大的数,那么他两…

【HTML】HTML基础7.2(有序列表)

目录 标签 效果 注意 标签 <ol> <li>列表内容</li> <li>列表内容</li> <li>列表内容</li> <li>列表内容</li> 。。。。。。 </ol> 效果 代码 <ol><li>银河护卫队 10000000000</li><l…

云计算的部署方式(公有云、私有云、混合云、社区云)

云计算的部署方式(公有云、私有云、混合云、社区云) 目录 零、00时光宝盒 一、云计算的部署方式 1.1、公有云&#xff08;Public Cloud&#xff09; 1.2、私有云&#xff08;Private Cloud&#xff09;  1.3、混合云&#xff08;Hybrid Cloud&#xff09; 1.4、社区云&am…

IO多路复用:2024/3/5

作业1、使用poll实现tcp服务器端&#xff0c;select实现tcp客户端 服务器端&#xff1a; #include <myhead.h> #define SER_IP "192.168.199.131" //服务端IP #define SER_PORT 8888 //服务端端口号int main(int argc, const char *argv[])…

调研图基础模型(Graph Foundation Models)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 图基础模型&#xff08;Graph Foundation Models&#xff0c;简称 GFMs&#xff09; 是一种经过预训练的图大模型&#xff0c;旨在处理不同领域的图数据和任务。让我们详细探讨一下这个概念。 Github …

什么是MGR高可用(完整版)

MGR简介 MGR是MySQL Group Replication的缩写&#xff0c;即MySQL组复制。 在以往&#xff0c;我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案&#xff0c;但这存在以下几个比较严重的问题&#xff1a; 主从复制间容易发生复制延迟&#xff0c;尤其是在5.6以前…

【考研数学】基础660太难了?一个办法搞定660

觉得题目太难&#xff0c;大概率是题目超出了自己当前的水平 题型没见过&#xff0c;或者太复杂&#xff0c;属于跳级学习了&#xff0c;正确的思路就是回归到自己的水平线&#xff0c;题目略难即可。 这样做题的话&#xff0c;大部分题目涉及的点不会超出自己的能力范围&…

Redis探秘:十大最佳应用场景揭示

文章目录 强烈推荐前言&#xff1a;应用场景:缓存:示例 会话管理:示例 队列:示例 计数器和统计:示例 发布/订阅:示例 分布式锁:示例 实时数据处理:示例 限流和速率控制:示例 会话存储和缓存:示例 地理位置应用:示例 总结&#xff1a;强烈推荐专栏集锦写在最后 强烈推荐 前些天…

爆肝!Claude3与ChatGPT-4到底谁厉害,看完你就知道了!

前言&#xff1a; 相信大家在pyq都被这张图片刷屏了把~ 昨天&#xff0c;为大家介绍了一下什么是Claude&#xff0c;今天咱终于弄到号了&#xff08;再被ban了3个号之后终于是成功的登上去了&#xff0c;如果各位看官觉得咱文章写的不错&#xff0c;麻烦点个小小的关注~你们的…

AI发展历程和常用框架

AI发展历程 近几年的人工智能发展历程可以大致划分为以下几个阶段&#xff1a; 数据驱动的突破&#xff08;2012-2015年&#xff09;&#xff1a;这一时期&#xff0c;随着大数据的兴起和计算能力的提升&#xff0c;深度学习技术开始取得突破。以AlexNet在2012年ImageNet图像…
最新文章