当前位置:首页>python>小白学python第74天之Python中多态

小白学python第74天之Python中多态

  • 2026-08-22 10:49:52
小白学python第74天之Python中多态

2.19

Python中多态

?

学前疑问

想象你要设计一个支付系统,需要支持支付宝、微信、银行卡等多种支付方式。你能否让系统在处理任何一种支付请求时,都使用同一句简单的“支付()”指令,而无需关心背后具体是哪种支付方式在运作?

1

Python中多态

(1)什么是多态

多态指的是一类事物有多种形态。

定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果。

① 多态依赖继承

② 子类方法必须要重写父类方法

首先定义一个父类,其可能拥有多个子类对象。当我们调用一个公共方法时,传递的对象不同,则返回的结果不同。

好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化!

(2)多态原理图

公共接口service就是多态的体现,随着传入水果对象的不同,能返回不同的结果。

(3)多态代码实现

多态:可以基于继承也可以不基于继承

class Fruit(object):    # 公共方法    def makejuice(self):        print('i can make juice')class Apple(Fruit):    def makejuice(self):        print('i can make  apple juice')class Banana(Fruit):    def makejuice(self):        print('i can make  banana juice')class Orange(Fruit):    def makejuice(self):        print('i can make  orange juice')# 定义公共方法如servicedef service(obj):    obj.makejuice()apple = Apple()banana = Banana()orange = Orange()for i in (apple, banana, orange):    service(i)

2

MRO属性或MRO方法

MRO(Method Resolution Order):方法解析顺序,我们可以通过类名.__mro__或类名.mro()获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找到。

class Car(object):    def __init__(self, brand, model, color):        self.brand = brand        self.model = model        self.color = color     def run(self):        print('i can run')class GasolineCar(Car):    def __init__(self, brand, model, color):        super().__init__(brand, model, color)    def run(self):        print('i can run with gasoline')class ElectricCar(Car):    def __init__(self, brand, model, color):        super().__init__(brand, model, color)        # 电池属性        self.battery = 70    def run(self):        print(f'i can run with electric,remain:{self.battery}')print(ElectricCar.__mro__)print(ElectricCar.mro())

说明:有MRO方法解析顺序可知,在类的继承中,当某个类创建了一个对象时,调用属性或方法,首先在自身类中去寻找,如找到,则直接使用,停止后续的查找。如果未找到,继续向上一级继承的类中去寻找,如找到,则直接使用,没有找到则继续向上寻找...直到object类,这就是Python类继承中,其方法解析顺序。

综上:object类还是所有类的基类(因为这个查找关系到object才终止)

今日学习完毕,课后作业: 

动物声音模拟器,题目要求:

(1)创建一个基类 Animal(动物),它包含一个名为 speak()的方法,该方法直接返回字符串 "动物发出声音..."。

(2)创建两个子类:Dog(狗)和 Cat(猫),它们都继承自 Animal类。

(3)在两个子类中分别重写 speak()方法:

① Dog类的 speak()方法返回 "汪汪汪!"

② Cat类的 speak()方法返回 "喵喵喵!"

(4)编写一个函数 animal_sound(animal),该函数接收一个动物对象,并调用其 speak()方法,然后打印返回的字符串。

(5)创建 Dog和 Cat的对象,并传入 animal_sound函数进行测试。

最新文章

随机文章