面向对象——多态
概念同一个方法名在不同对象上调用时能呈现不同的行为。标准多态条件继承方法重写类型限制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()#张三正在说话