面向对象——多态

概念

同一个方法名,在不同对象上调用时,能呈现不同的行为。

标准多态

条件:

  • 继承
  • 方法重写
  • 类型限制
class Animal: def speak(self): print("动物正在发出叫声!") #继承 class Dog(Animal): def speak(self): print("汪汪汪!") class Cat(Animal): def speak(self): print("喵喵喵!") class Pig: def speak(self): print("哼哼哼!") def make_sound(animal:Animal): # 类型限制 # 多态的表现 animal.speak() make_sound(Animal())# 动物正在发出叫声! make_sound(Dog())# 汪汪汪! make_sound(Cat())# 喵喵喵! make_sound(Pig())# 哼哼哼! 在其他语言中会报错,在python中不会,十分不推荐

鸭子多态

核心理念:如果一个东西看起来像鸭子,叫起来也想鸭子,那它就是鸭子。

鸭子类型是一种编程风格,它不检查对象的类型,只关注对象能否“做某件事”(是否有对应的方法)。

#鸭子多态 class Dog: def speak(self): print("汪汪汪!") class Cat: def speak(self): print("喵喵喵!") class Pig: def speak(self): print("哼哼哼!") class Computer: def speak(self): print("滋滋滋!") # 无类型限制,只要有speak方法即可 def make_sound(animal): animal.speak() # 成功调用 make_sound(Dog())#汪汪汪! make_sound(Cat())#喵喵喵! make_sound(Pig())#哼哼哼! make_sound(Computer())#滋滋滋!

抽象类

定义:【抽象类】是一种不能直接实例化的类,它通常作为“规范”,让子类去继承,并必须实现其中定义的【抽象方法】。

定义抽象类需要引入abc包。【from abc import ABC, abstractmethod】

被@abstractmethod修饰的是抽象方法,继承ABC的类是抽象类。

验证:抽象类无法实例化。

如果抽象类没有抽象方法,可以实例化对象。不推荐,因为没有抽象方法,就不需要定义抽象类了。

验证:继承抽象类的子类必须实现抽象类的所有抽象方法。

from abc import ABC, abstractmethod #MustRun类一旦继承了ABC类,那么MustRun类就是抽象类了 class MustRun(ABC): #定义抽象方法,不需要实现 @abstractmethod def run(self): pass #抽象类也可以定义正常方法 def speak(self): print(f"{self.name}正在说话!") class Person(MustRun): def __init__(self, name, age): self.name = name self.age = age def run(self): print(f"{self.name}正在努力奔跑!") p1 = Person("张三", 18) p1.run() #张三正在努力奔跑! p1.speak()#张三正在说话!