程序猿和设计师都是人类,他们都重写了父类的 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,然后重写方法才能正常调用