Python - 面向对象编程 - 三大特性之多态

简介: Python - 面向对象编程 - 三大特性之多态

前置知识


封装

 

继承

 

多态


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


image.png

程序猿和设计师都是人类,他们都重写了父类的 work 方法,但他们都有自己的实现逻辑

 

多态的栗子一


需求

  • 定义 Dog 类封装方法 game,普通狗狗简单玩耍
  • 定义 ChaiQuan 继承 Dog,重写 game 方法,柴犬疯疯癫癫的玩耍
  • 定义 Person 类,封装一个和狗玩的方法,在方法内部,直接调用狗对象调用玩耍的方法

 

类图

image.png

实际代码

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 方法

 

类图

image.png

实际代码

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,然后重写方法才能正常调用

 

相关文章
|
12月前
|
Java 程序员 C++
Python 面向对象详解!
本文详细介绍了Python中的面向对象编程(OOP),包括类、对象、继承、封装、多态和抽象等核心概念。通过具体示例,解释了如何使用类定义对象的属性和方法,以及如何通过继承实现代码重用。文章还探讨了封装和多态的重要性,并介绍了私有属性和抽象类的使用方法。最后,总结了OOP的四大支柱:封装、抽象、继承和多态,强调了这些概念在Python编程中的应用。适合Java程序员扩展Python编程知识。
306 2
|
7月前
|
Python
Python 高级编程与实战:深入理解面向对象与并发编程
本文深入探讨Python的高级特性,涵盖面向对象编程(继承、多态、特殊方法、类与实例属性)、异常处理(try-except、finally)和并发编程(多线程、多进程、异步编程)。通过实战项目如聊天服务器和异步文件下载器,帮助读者掌握这些技术,编写更复杂高效的Python程序。
|
8月前
|
安全 数据处理 索引
深入探讨 Python 列表与元组:操作技巧、性能特性与适用场景
Python 列表和元组是两种强大且常用的数据结构,各自具有独特的特性和适用场景。通过对它们的深入理解和熟练应用,可以显著提高编程效率和代码质量。无论是在数据处理、函数参数传递还是多线程环境中,合理选择和使用列表与元组都能够使得代码更加简洁、高效和安全。
171 9
|
10月前
|
设计模式 Python
简单分享下python多态
多态是面向对象编程中至关重要的特性,通过继承和方法重写,可以实现代码复用和灵活扩展。Python的鸭子类型进一步增强了多态的灵活性,使得代码更具适应性。通过理解和应用多态,可以写出更为简洁、优雅和高效的代码。
145 9
|
10月前
|
Python
闭包(Closure)是**Python中的一种高级特性
闭包(Closure)是**Python中的一种高级特性
135 8
|
10月前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
12月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
117 6
Python面向对象(2)
|
12月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
97 2
Python面向对象
|
12月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
99 2
|
12月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
114 1

推荐镜像

更多