前置知识

封装

继承

多态

  • 不同的子类对象调用相同的父类方法,产生不同的执行结果
  • 以继承和重写父类方法为前提
  • 是调用方法的技巧,不会影响到类的内部设计

程序猿和设计师都是人类,他们都重写了父类的 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 - 面向对象编程 - 三大特性之多态的更多相关文章

  1. Python - 面向对象编程 - 三大特性之继承

    继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...

  2. 3.java面向对象编程三大特性之多态

    面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对类的外部而言它的内部实现细节是隐藏的,暴露给外界的只是它的实现方法. ...

  3. Python - 面向对象编程 - 三大特性之封装

    简单介绍封装 封装是面向对象编程的一大特点 封装可以被认为是一个保护屏障,防止该类的属性.方法和数据结构被外部随意访问 要访问该类的属性.私有方法.数据结构,必须由指定的方法控制访问 深入理解封装 在 ...

  4. python面向对象的三大特性之一多态

    多态 多态的特性是调用不同的子类将会产生不同的行为,而无需明确知道这个子类实际上是什么 说白了就是,不同的对象调用相同的方法,产生不同的行为 例如:s1是字符串类型,w1是列表,两个完全不同的对象,他 ...

  5. Java基础-面向对象第三大特性之多态(polymorphism )

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  6. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  7. Python 面向对象的三大特性:封装,继承,多态

    # 面向对象的三大特性:封装,继承,多态 # 继承的影响:资源的继承,资源的使用,资源的覆盖,资源的累加 # 资源的继承,在Python中的继承是指能使用父类的资源,而不是说在子类也复制一份父类代码到 ...

  8. Python 面向对象的三大特性

    面向对象的三大特性:继承,封装,多态 什么时候用封装: 同一种功能的时候, 譬如:把一部分数据或方法,封装到同一个类的中 PS:在构造方法中,原始数据中....

  9. Python面向对象编程高级特性

    ***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制 ...

随机推荐

  1. synchronized 优化手段之锁膨胀机制!

    synchronized 在 JDK 1.5 之前性能是比较低的,在那时我们通常会选择使用 Lock 来替代 synchronized.然而这个情况在 JDK 1.6 时就发生了改变,JDK 1.6 ...

  2. 机器学习 - k-means聚类

    k-means简介 k-means是无监督学习下的一种聚类算法,简单说就是不需要数据标签,仅靠特征值就可以将数据分为指定的几类.k-means算法的核心就是通过计算每个数据点与k个质心(或重心)之间的 ...

  3. 在vue中使用微信jssdk的getLocalImgData怎么让多张图片显示

    在循环里添加了一个异步请求类型的,所以我让他每次执行完毕后再执行下一次操作,其中用到了async 和 await,将异步变为同步去执行. 1 // 图片上传 2 handleImage(typeVal ...

  4. 🏆【Java技术专区】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!

    前提概要 Java的class字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机 ...

  5. .net 知新:【4】NuGet简介和使用

    在包管理以前我们在项目中引用第三方包通常是去下载dll放到项目中再引用,后来逐渐发展成各种包管理工具,nuget就是一种工具,适用于任何现代开发平台的基本工具可充当一种机制,通过这种机制,开发人员可以 ...

  6. pwnable.kr之unlink

    pwnable.kr之unlink 之前在看别的东西,学习的随笔也没有写完......颓了几天. 由于最近在看堆,就把pwnable.kr上unlink这道题做一下,学习一下. 1.程序分析 #inc ...

  7. python,ctf笔记随笔

    一.在centos虚拟机中安装pyhton3环境: 安装pip3:yum install python36-pip 将pip升级到最新版本:pip3 install --upgrade pip 运行p ...

  8. 【LeetCode】316. 去除重复字母

    316. 去除重复字母 知识点:栈:单调 题目描述 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). 示例 输 ...

  9. [SQL]修改和删除基本表

    修改基本表 SQL语言用alter table语句修改基本表,其一般格式如下: alter table <表名> add <列名> <数据类型> [<列级完整 ...

  10. 接口自动化测试之httprunner初探

    ❝ 今天来介绍一个python的一个开源项目:httprunner,接口自动化工具.第一次输入,难免有不周到的地方,轻喷~ ❞ 介绍: HttpRunner是一个简单优雅但功能强大的 HTTP(S) ...