程序猿和设计师都是人类,他们都重写了父类的 work 方法,但他们都有自己的实现逻辑
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) # 输出结果 小菠萝 正在和 小柴犬 愉快的玩耍 小柴犬 柴犬在疯疯癫癫的玩耍 小菠萝 正在和 旺财 愉快的玩耍 旺财 狗狗在玩耍
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) # 输出结果 汪汪汪..... 喵喵喵.....
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,然后重写方法才能正常调用