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作为一种动态语言,他的动态绑定机制 ...
随机推荐
- SQL Server CPU 利用率毛刺的分析定位与解决
一.背景 1.1 问题描述 近期发现一台SQL Server的CPU利用率很不稳定,发现不定时的飙升到100%,更可怕的是在业务繁忙时,影响了业务调用,失败率明显增加,所以,减低CPU的利用率,是迫切 ...
- RHCE_DAY04
sed流式编辑器 sed是一个非交互的文本编辑器,实现的功能跟vim相同,主要是对文件内容进行输出.删除.替换.复制.剪切.导入.导出等功能 命令格式1:前置命令 | sed [选项] '[指令]' ...
- C++ //继承中构造和析构顺序
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class Base 6 { 7 pu ...
- C语言运算符(关系运算符)+(逻辑运算符)
下表显示了 C 语言支持的所有关系运算符.假设变量 A 的值为 10,变量 B 的值为 20,则: 实列: 1 #include <stdio.h> 2 3 int main() 4 { ...
- Kotlin高阶函数实战
前言 1. 高阶函数有多重要? 高阶函数,在 Kotlin 里有着举足轻重的地位.它是 Kotlin 函数式编程的基石,它是各种框架的关键元素,比如:协程,Jetpack Compose,Gradle ...
- HCNA Routing&Switching之STP端口状态、计时器以及拓扑变化
前文我们了解了STP选举规则相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15131999.html:今天我们来聊一聊STP的端口状态.计时器.端口状 ...
- Cookie和Session得使用理解
Cookie 饼干 什么是Cokkie? 1.Cookie 翻译过来是饼干的意思. 2.Cookie 是服务器通知客户端保存键值对的一种技术. 3.客户端有了 Cookie 后,每次请求都发送给服务器 ...
- Spring学习03(Bean的自动装配)
6.Bean的自动装配 6.1 自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring中bean的三种装配机 ...
- awk-07-IO和printf语句
IO语句 1.getline 2.getline var 把a文件的行,追加到b文件的结尾 把 a 文件的行替换 b 文件的指定字段 把 a 文件的行替换 b 文件的对应字段 3.command | ...
- Java Swing 空布局
Swing 空布局 试了盒布局,说实话不太会用,很多地方都没法更加的细节,又翻了翻资料,知道了还有一个空布局,一看,真不错,很适合我这种菜鸡 用坐标就可以完成界面的布局,不错 话不多说,直接代码 pa ...