Python中的类和对象(6)

news2024/9/29 17:35:50

文章目录

  • 1.多态
  • 2.类继承的多态
  • 3.自定义函数的多态
  • 4.鸭子类型
  • 5.思维导图

1.多态

多态在编程中是一个非常重要的概念,它是指同一个运算符、函数或对象在不同的场景下,具有不同的作用效果,这么一个技能。

我们知道加号(+)和乘号(*)运算符在 Python 被广泛使用,但是它们并非只是单一的用途,比如当两边都是数字的时候,它们执行的是算术运算:

>>> 3 + 5
8
>>> 3 * 5
15

遇到字符串,会变成另一种情况

>>> "Py" + "FishC"
'PyFishC'
>>> "FishC" * 3
'FishCFishCFishC'

执行的是拼接和重复~

这种 “见机行事” 的行为,我们就称之为多态。

除了运算符之外,Python 中有一些函数也是支持多态的,比如 len() 函数,它的功能是获取一个对象的长度:

>>> len("FishC")
5
>>> len(["Python", "FishC", "Me"])
3
>>> len({"name":"小甲鱼", "age":"18"})
2

你看,给它传递一个字符串,它帮你统计字符的个数;给它传递一个列表,它帮你统计列表中元素的个数;给它传递一个字典,它计算的是字典中键的个数。这就是函数的多态性。

多态的好处这样就一目了然了,尽管我们的接口是不变的,但它却可以根据不同的对象执行不同的操作。

2.类继承的多态

Python 允许我们在子类中定义与父类同名的方法。就是如果我们对于父类的某个方法不满意的话,完全是可以在子类中重新定义一个同名的方法进行覆盖,这种做法我们称为重写,这在前面的课程有讲解过了。

重写,其实就是实现类继承的多态:

>>> class Shape:
...     def __init__(self, name):
...         self.name = name
...     def area(self):
...         pass
...        
>>> class Square(Shape):
...     def __init__(self, length):
...         super().__init__("正方形")
...         self.length = length
...     def area(self):
...         return self.length * self.length
...        
>>> class Circle(Shape):
...     def __init__(self, radius):
...         super().__init__("圆形")
...         self.radius = radius
...     def area(self):
...         return 3.14 * self.radius * self.radius
...        
>>> class Triangle(Shape):
...     def __init__(self, base, height):
...         super().__init__("三角形")
...         self.base = base
...         self.height = height
...     def area(self):
...         return self.base * self.height / 2
...
>>> s = Square(5)
>>> c = Circle(6)
>>> t = Triangle(3, 4)
>>> s.name
'正方形'
>>> c.name
'圆形'
>>> t.name
'三角形'
>>> s.area()
25
>>> c.area()
113.03999999999999
>>> t.area()
6.0

正方形、圆形、三角形都继承自 Shape 类,但又都重写了构造函数和 area() 方法,这就是多态的体现。

3.自定义函数的多态

>>> class Cat:
...     def __init__(self, name, age):
...         self.name = name
...         self.age = age
...     def intro(self):
...         print(f"我是一只沙雕猫咪,我叫{self.name},今年{self.age}岁~")
...     def say(self):
...         print("mua~")
...
>>> class Dog:
...     def __init__(self, name, age):
...         self.name = name
...         self.age = age
...     def intro(self):
...         print(f"我是一只小狗,我叫{self.name},今年{self.age}岁~")
...     def say(self):
...         print("哟吼~")
...
>>> class Pig:
...     def __init__(self, name, age):
...         self.name = name
...         self.age = age
...     def intro(self):
...         print(f"我是一只小猪,我叫{self.name},今年{self.age}岁~")
...     def say(self):
...         print("oink~") # 不要问我猪为什么这么叫,我是跟隔壁幼儿园的小朋友学的,oink~
...
>>> c = Cat("web", 4)
>>> d = Dog("布布", 7)
>>> p = Pig("大肠", 5)
>>> def animal(x):
...     x.intro()
...     x.say()
...        
>>> animal(c)
我是一只沙雕猫咪,我叫宝儿,今年3~
mua~
>>> animal(d)
我是一只小狗,我叫布布,今年5~
哟吼~
>>> animal(p)
我是一只小猪,我叫大肠,今年5~
oink~

看,这个 animal() 函数就具有多态性,该函数接收不同对象作为参数,并在不检查其类型的情况下执行其方法。

4.鸭子类型

>>> class Bicycle:
...     def intro(self):
...         print("我曾经跨过山和大海,也穿过人山人海~")
...     def say(self):
...         print("都有自行车了,要什么兰博基尼?")
...

自行车这个类,既有 intro() 方法,也有 say() 方法,所以它即便被前面的 animal() 函数所调用,也不会出错:

>>> b = Bicycle()
>>> animal(b)
我曾经跨过山和大海,也穿过人山人海~
都有自行车了,要什么兰博基尼?

编程中鸭子类型的概念就是:我们不需要关心对象具体是什么类型,只在乎它的行为方法是否符合要求即可。

5.思维导图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

加载sklearn新闻数据集出错 fetch_20newsgroups() HTTPError: HTTP Error 403: Forbidden解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

大数据框架之Hadoop:入门(五)Hadoop编译源码(面试重点)

5.1 前期准备工作 1.CentOS联网 配置CentOS能连接外网。Linux虚拟机ping www.baidu.com 是畅通的 注意:采用root角色编译,减少文件夹权限出现问题 2.jar包准备(hadoop源码、JDK8、maven、ant 、protobuf) (1)hadoop-2.7.7-sr…

【TCP的拥塞控制】基于窗口的拥塞控制

TCP的拥塞窗口CWND大小和传输轮次n的关系如下所示。(本题10分) cwnd12481632333435363738394041422122232425261248N1234567891011121314151617181920212223242526 问题: (1)慢开始阶段的时间间隔?&#…

NFC enable NFC使能流程

同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 NFC enable NFC使能流程 认识nfc系统如何工作,最好的方法就是了解nfc的各个流程,…

linux系统下SVN服务器搭建

linux新手,整了好几天才搞好,做下笔记以备后续使用: 1、下载svn服务器 yum -y install subversion 2、创建仓库 svnadmin create /opt/svn/pro/respos1 svnadmin create /opt/svn/pro/respos2 3、配置用户以及权限 1:cd到仓库目录下&#…

py3常用返回规则字符串的函数+ascii与char的转换

文章目录py3常用返回规则字符串的函数字符转ascii以及ascii转字符的方法为:py3常用返回规则字符串的函数 注明原来的网址为:https://docs.python.org/3.8/library/string.html string.ascii_letters 返回所有的大写、小写字母 string.ascii_lowercase 返…

寒假安全作业nginx-host绕过实例复现

1.测试环境搭建 LNMP架构的话,肯定就是linux、nginx、mysql、php四大组件。在后面的复现中我们还会用到https的一部分知识,故这里的nginx就需要使用虚拟主机并且配置https证书,且具有php解析功能。 1.1 基础nginx配置 #1.创建web目录 mkdir …

MySQL-InnoDB行格式浅析

简介 我们知道读写磁盘的速度非常慢,和内存读写差了几个数量级,所以当我们想从表中获取某些记录时, InnoDB 存储引擎需要一条一条的把记录从磁盘上读出来么? 不,那样会慢死,InnoDB 采取的方式是&#xff1a…

雅思经验(十三)

感觉这篇其实有点小难,我在精听的才发现那是六个实验对象,但是叫做six subjects在精听的时候感觉有些手忙脚乱,像是一团乱麻一样,但是也是没有什么关系。其实这才是查漏补缺,cello player 这是大提琴师violinists 小提…

08- 数据升维 (PolynomialFeatures) (机器学习)

在做数据升维的时候,最常见的手段就是将已知维度进行相乘(或者自乘)来构建新的维度 使用 np.concatenate()进行简单的,幂次合并,注意数据合并的方向axis 1 数据可视化时,注意切片,因为数据升维…

SpringDI自动装配BeanSpring注解配置和Java配置类

依赖注入 上篇博客已经提到了DI注入方式的构造器注入&#xff0c;下面采用set方式进行注入 基于set方法注入 public class User {private String name;private Address address;private String[] books;private List<String> hobbys;private Map<String,String>…

【Linux】多线程编程 - 概念/pthread库调用接口/互斥

目录 一.线程概念 1.Linux中线程如何实现 2.POSIX线程库: pthread第三方线程库 3.线程与进程的数据存放问题 4.线程的"高效"具体体现在哪 5.线程优缺点 二.线程控制 0.关于pthread_t类型 1.线程创建 2.线程终止 3.线程等待 4.线程分离 5.代码验证 三.线…

你期待已久的《动手学深度学习》(PyTorch版)来啦!

《动手学深度学习》全新PyTorch版本&#xff0c;李沐和亚马逊科学家阿斯顿张等大咖作者强强联合之作&#xff0c;机器学习、深度学习领域重磅教程&#xff0c;交互式实战环境&#xff0c;配套资源丰富&#xff01; 面向中文读者的能运行、可讨论的深度学习入门书。 动手学深度…

一个优质软件测试工程师简历的范文(一定要收藏)

很多刚转行软件测试的小伙伴是不是不知道怎么写好一份优质的软件测试工程师的简历。今天呢&#xff0c;就给大家分享一下一个优质软件测试工程师简历的范文。记得收藏起来哦。 下面的案例&#xff1a;2-3年的软件测试工程的简历 姓 名&#xff1a;XXX 学历&#xff1a…

2023备战金三银四,Python自动化软件测试面试宝典合集(五)

接上篇八、抓包与网络协议8.1 抓包工具怎么用 我原来的公司对于抓包这块&#xff0c;在 App 的测试用得比较多。我们会使用 fiddler 抓取数据检查结果&#xff0c;定位问题&#xff0c;测试安全&#xff0c;制造弱网环境;如&#xff1a;抓取数据通过查看请求数据&#xff0c;请…

FPGA实现不同分辨率视频切换输出,串口协议帧控制,提供工程源码和技术支持

目录1、不同分辨率视频切换输出原理2、设计思想和架构详解3、vivado工程详解4、上板调试验证并演示5、福利&#xff1a;工程代码的获取1、不同分辨率视频切换输出原理 不同分辨率的视频输出对应不同的时序和时钟&#xff0c;一般情况下是不存在同时或分时输出的&#xff0c;但…

结构体变量

C语言允许用户自己建立由不同类型数据组成的组合型的数据结构&#xff0c;它称为结构体&#xff08;structre&#xff09;。 在程序中建立一个结构体类型&#xff1a; 1.结构体 建立结构体 struct Student { int num; //学号为整型 char name[20]; //姓名为字符串 char se…

基于spring boot +opencv 实现车牌识别、人脸识别、证件识别等功能 附完整代码 毕业设计

界面展示: 这是一个基于spring boot + opencv 实现的项目贯穿样本处理、模型训练、图像处理、对象检测、对象识别等技术点以学习交流为目的&

装满杯子需要的最短总时长-力扣2335-java双百方案

一、题目描述 现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下标从 0 开始、长度为 3 的整数数组 amount &#xff0c;其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水…

用Javascript对二维数组DIY按汉语拼音的排序方法

继续编写“圳品”信息系统&#xff0c;将“圳品”信息读取到JavaScript定义的一个二维数组中进行处理和显示&#xff1a;var p [[100, "都安县丙公司", "产品ab", 5, 25, 10],[50, "南丹县a公司", "产品a", 5, 25, 10],[30, "罗…