Python - 面向对象编程 - 三大特性之多态
前置知识
封装
- 详解文章:https://www.cnblogs.com/poloyy/p/15203989.html
- 封装根据职责将属性、方法封装到一个抽象的类中
- 定义类的准则-封装
继承
- 详解文章:https://www.cnblogs.com/poloyy/p/15216652.html
- 继承实现代码的重用,相同的代码不需要重复的编写
多态
- 不同的子类对象调用相同的父类方法,产生不同的执行结果
- 以继承和重写父类方法为前提
- 是调用方法的技巧,不会影响到类的内部设计

程序猿和设计师都是人类,他们都重写了父类的 work 方法,但他们都有自己的实现逻辑
多态的栗子一
需求
- 定义 Dog 类封装方法 game,普通狗狗简单玩耍
- 定义 ChaiQuan 继承 Dog,重写 game 方法,柴犬疯疯癫癫的玩耍
- 定义 Person 类,封装一个和狗玩的方法,在方法内部,直接调用狗对象调用玩耍的方法
类图

实际代码
class Dog:
def __init__(self, name):
self.name = name def game(self):
print(f"{self.name} 狗狗在玩耍") class ChaiQuan(Dog):
def game(self):
print(f"{self.name} 柴犬在疯疯癫癫的玩耍") class Person:
def __init__(self, name):
self.name = name def gameWithDog(self, dog):
print(f"{self.name} 正在和 {dog.name} 愉快的玩耍")
# 直接通过狗实例对象调用 game 实例方法,不需要关心是哪种狗
dog.game() chai = ChaiQuan("小柴犬")
dog = Dog("旺财")
p = Person("小菠萝")
p.gameWithDog(chai)
p.gameWithDog(dog) # 输出结果 小菠萝 正在和 小柴犬 愉快的玩耍
小柴犬 柴犬在疯疯癫癫的玩耍 小菠萝 正在和 旺财 愉快的玩耍
旺财 狗狗在玩耍
- Person 类中只需要让狗对象调用 game 方法,而不用关心具体是什么狗
- game 方法是在 Dog 父类中定义的
- 在程序执行时,传入不同的狗对象参数,gameWithDog 就会产生不同的执行结果
通过统一函数接口实现多态
class Dog(object):
def sound(self):
print("汪汪汪.....") class Cat(object):
def sound(self):
print("喵喵喵.....") def make_sound(animal):
# 统一调用接口
# 不管你传进来是什么动物,我都调用sound()方法
animal.sound() dogObj = Dog()
catObj = Cat()
make_sound(dogObj)
make_sound(catObj) # 输出结果
汪汪汪.....
喵喵喵.....
通过抽象类实现多态
需求
- 定义一个 Person 类,可以开车,也可以停车
- 定义一个 Car 类,提供 drive、stop 的方法
- 定义一个 Truck、BaoMa 类,继承 Car 类,重写 drive、stop 方法
类图

实际代码
class Car:
def __init__(self, name):
self.name = name def drive(self):
# 抛出异常是防止通过 Car 直接定义实例对象
# 如果 Car 的实例对象调用此方法会报错,必须由子类重写才正确
raise NotImplementedError("Subclass must implement abstract method") def stop(self):
raise NotImplementedError("Subclass must implement abstract method") class Truck(Car):
def drive(self):
print(f"{self.name} Truck 准备上路了") def stop(self):
print(f"{self.name} Truck 准备停车") class BaoMa(Car):
def drive(self):
print(f"{self.name} BaoMa 要跑到100km/h了") def stop(self):
print(f"{self.name} BaoMa 漂移停车") class Person:
def __init__(self, name):
self.name = name def driveCar(self, car):
print(f"{self.name} 准备开车上路了")
car.drive() def stopCar(self, car):
print(f"{self.name} 准备靠边停车")
car.stop() person = Person("小菠萝")
truck = Truck("小卡车")
baoma = BaoMa("大宝马")
person.driveCar(truck)
person.stopCar(baoma) # 输出结果
小菠萝 准备开车上路了
小卡车 Truck 准备上路了 小菠萝 准备靠边停车
大宝马 BaoMa 漂移停车
Car 是一个抽象类,并不需要通过它创建实例对象,所以 Car 的实例方法都会抛出异常,由子类继承 Car,然后重写方法才能正常调用
Python - 面向对象编程 - 三大特性之多态的更多相关文章
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- 3.java面向对象编程三大特性之多态
面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对类的外部而言它的内部实现细节是隐藏的,暴露给外界的只是它的实现方法. ...
- Python - 面向对象编程 - 三大特性之封装
简单介绍封装 封装是面向对象编程的一大特点 封装可以被认为是一个保护屏障,防止该类的属性.方法和数据结构被外部随意访问 要访问该类的属性.私有方法.数据结构,必须由指定的方法控制访问 深入理解封装 在 ...
- python面向对象的三大特性之一多态
多态 多态的特性是调用不同的子类将会产生不同的行为,而无需明确知道这个子类实际上是什么 说白了就是,不同的对象调用相同的方法,产生不同的行为 例如:s1是字符串类型,w1是列表,两个完全不同的对象,他 ...
- Java基础-面向对象第三大特性之多态(polymorphism)
Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- Python 面向对象的三大特性:封装,继承,多态
# 面向对象的三大特性:封装,继承,多态 # 继承的影响:资源的继承,资源的使用,资源的覆盖,资源的累加 # 资源的继承,在Python中的继承是指能使用父类的资源,而不是说在子类也复制一份父类代码到 ...
- Python 面向对象的三大特性
面向对象的三大特性:继承,封装,多态 什么时候用封装: 同一种功能的时候, 譬如:把一部分数据或方法,封装到同一个类的中 PS:在构造方法中,原始数据中....
- Python面向对象编程高级特性
***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制 ...
随机推荐
- Jms - SSRF - 代码审计
在先知上看见一人发的文章.. 一看ID这么熟悉 原来是一个群友 唉 自己审计这么垃圾 几百年没搞过了 然后玩玩吧 一打开源码 我吐了 ctrl+alt+l格式化下代码 顺眼多了 然后Seay走了一波 ...
- 【LeetCode】738. 单调递增的数字
738. 单调递增的数字 知识点:字符串:贪心 题目描述 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增. (当且仅当每个相邻位数上的数字 x ...
- 使用各类BeanUtils的时候,切记注意这个坑!
在日常开发中,我们经常需要给对象进行赋值,通常会调用其set/get方法,有些时候,如果我们要转换的两个对象之间属性大致相同,会考虑使用属性拷贝工具进行. 如我们经常在代码中会对一个数据结构封装成DO ...
- 解决win10快速访问不能取消固定
最近发现win10的快速访问不能取消固定,比如ftp和smb之类的都不能取消固定 最后百度了一下发现一个简易的方法: 在文件资源管理器地址栏输入:%APPDATA%\Microsoft\Windows ...
- MySQL-17-MHA高可用技术
环境准备 环境准备 至少准备3台独立的虚拟机数据库实例,建议4台 这里实验只准备3台,需要配置好 基于GTID的主从复制,具体怎么配置可以参看前面的章节 db01 10.0.0.51 主库 db02 ...
- 【Java】jeesite使用学习
初始配置环境及软件: 名称 版本 作用 Tomcat 7.0 微小型服务器,版本无所谓,装个Tomcat 9估计也没事 IntelliJ IDEA 2021.1.3 x64 2021.1.3 编译器, ...
- luogu P4206 聪聪和可可
聪聪和可可 鸽了两天 \(dijkstra\)预处理出来两点之间的最短路径\(dis\)数组,读题发现,\(cat\)的走位很怪sb斩了,所以我们设一个\(next\)数组,\(next[i][j]\ ...
- mysql查询附近门店
mysql 查询一个地点(经纬度) 附近N公里内的数据.(根据一个地点的经纬度查询这个地点方圆几公里内的数据)1.创建测试表 CREATE TABLE `location` ( `id` int(10 ...
- 【spring 注解驱动开发】扩展原理
尚学堂spring 注解驱动开发学习笔记之 - 扩展原理 扩展原理 1.扩展原理-BeanFactoryPostProcessor BeanFactoryPostProcessor * 扩展原理: * ...
- wpf 富文本编辑器richtextbox的简单用法
最近弄得一个小软件,需要用到富文本编辑器,richtextbox,一开始以为是和文本框一样的用法,但是实践起来碰壁之后才知道并不简单. richtextbox 类似于Word,是一个可编辑的控件.结构 ...