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作为一种动态语言,他的动态绑定机制 ...
随机推荐
- PHP imap 远程命令执行漏洞(CVE-2018-19518)
影响版本 PHP:5.6.38 系统:Debian/ubuntu 构造数据包 成功执行命令echo '1234567890'>/tmp/test0001
- 论文笔记:(ICML2020)On Learning Sets of Symmetric Elements
目录 摘要 一.引言 二.先前的工作 三.基础 3.1 符号和基本定义 3.2 G-不变网络 3.3 描述等变层 3.4 Deep sets 四.DSS层 4.1 对称元素集合 4.2 等变层的表征 ...
- fastboot刷机小脚本
在Windows系统下,一般刷机命令是在cmd路径下执行如下命令: 1.adb reboot bootloader2.fastboot flash boot +boot路径3.fastboot fla ...
- DNS反向解析,主从服务器,分离解析(内外网)
目录 实验一:DNS反向解析 1.安装bind 2.查找配置文件路径 3.配置/etc/named.conf主配置文件 4.修改/etc/named.rfc1912.zones区域配置文件(复制两个) ...
- CRC校验原理和verilog实现方法(三)
1 代码生成 verilog实现CRC校验,可以充分发挥FPGA的硬件特性,即并行运算的能力. 具体实现方式,可以参考我上一篇博客,关键是用线性反馈移位寄存器表示出多项式,另外注意校验数据高位在先.然 ...
- RHCSA_DAY09
常用特殊符号的使用 Linux系统下通配符起到了很大的作用,对于不确定的文档名称可以使用以下特殊字符表示 *常用的特殊符号,在文件名上,用来代表任意多个任意字符** ? 常用的特殊符号,在文件名上,用 ...
- Spring Cloud 专题之七:Sleuth 服务跟踪
书接上回: SpringCloud专题之一:Eureka Spring Cloud专题之二:OpenFeign Spring Cloud专题之三:Hystrix Spring Cloud 专题之四:Z ...
- 探讨UE4中的UBT和UHT
前言 UBT和UHT是编译工具,谁定义的呢,虚幻引擎自己定义的,拿来做什么呢,UBT和UHT是UE4用来简化多平台编译,去除用户自定义平台编译项目的操作 我们写的UE4代码不是标准的C++代码,是基于 ...
- 一键部署lnmp基本
#!/bin/bash systemctl stop firewalld systemctl disable firewalld setenforce 0 #--------nginx-------- ...
- 基于ssm的电影售票选座管理系统基于Java的电影网站的网页设计与制作源码
注意:此项目只截图部分功能,可评论区咨询查看项目全部功能演示! 1.开发环境 开发语言: 后台框架:SSM(Spring+SpringMVC+Mybatis) 前端技术:HTML+CSS+JavaSc ...