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

 

相关文章
|
1月前
|
Python
请简述Python中的继承、封装和多态的概念。
【2月更文挑战第24天】【2月更文挑战第82篇】请简述Python中的继承、封装和多态的概念。
|
1月前
|
Python
Python中的面向对象编程与继承
本文将深入探讨Python中面向对象编程的核心概念,重点讨论继承的实现原理以及在实际开发中的应用。通过详细的示例和解释,读者将能够全面理解Python中继承的使用方式和优势,为提高代码的复用性和可维护性提供有效的技术支持。
|
2天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
10天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
52 0
|
19天前
|
Python
Python面向对象编程学习应用案例详解
面向对象编程在Python中通过类定义对象结构和行为。示例:1) 使用`class`关键字定义类,如`class Person`;2) `__init__`方法初始化对象属性,如`self.name`和`self.age`;3) 实例化对象,如`person1 = Person("张三", 25)`;4) 访问属性和方法,如`person1.name`;5) 定义类方法,如`def introduce(self)`;6) 调用方法,如`person1.introduce()`;7) 类继承,如`class Student(Person)`;8) 多态,通过继承重写方法实现。
9 1
|
1月前
|
Python
Python面向对象编程简介
Python面向对象编程简介
18 1
|
1月前
|
存储 机器学习/深度学习 数据安全/隐私保护
【Python 基础教程 24】全面入门Python面向对象编程:深度探索与实战教程
【Python 基础教程 24】全面入门Python面向对象编程:深度探索与实战教程
79 0
|
1月前
|
Python
在Python中,如何实现多态?
在Python中,如何实现多态?
20 1
|
1月前
|
Java 程序员 数据安全/隐私保护
Python教程第6章 | Python面向对象
Python面向对象概念、类的定义和调用、类方法、修改和增加类属性、类和对象、初始化函数、类的继承、类的多态、类的访问控制
44 0
|
1月前
|
存储 Python
Python的面向对象编程(OOP)
Python的面向对象编程(OOP)
15 0