#Python 的继承和多态
继承 是基于已有的类创建新类的语法,被继承的类称为 父类,创建的新类称为 子类。子类自动拥有父类相同的属性和方法。
class 类名(父类名):
pass
父类也称基类、超类,子类也称派生类。
例如:
class Pet:
"""
宠物类
"""
def __init__(self, name:str):
"""
构造函数
参数:
name(str):名字
"""
self.__name = name
def name(self) -> str:
"""
name 方法,获取名字
返回值:
str:宠物的名字
"""
return self.__name
# 猫类继承宠物类
class Cat(Pet):
# 添加额外的方法
def catch_mouses():
pass
# 狗类继承宠物类
class Dog(Pet):
# 添加额外的方法
def guard_gates():
pass
# 创建对象,使用继承的构造函数
tom = Cat("Tom")
happy = Cat("Happy")
spike = Dog("Spike")
# 调用继承的方法
print(tom.name())
print(happy.name())
print(spike.name())
#多态
子类可以重新定义父类的方法:
class Pet:
"""
宠物类
"""
def speak(self):
"""
speak 方法,说话
"""
print("某种动物在说话")
class Cat(Pet):
"""
猫类,继承宠物类
"""
def speak(self):
"""
speak 方法,说话
"""
print("喵喵喵")
class Dog(Pet):
"""
狗类,继承宠物类
"""
def speak(self):
"""
speak 方法,说话
"""
print("汪汪汪")
class Rabbit(Pet):
"""
兔子类,继承宠物类
"""
# 创建对象
cat = Cat()
dog = Dog()
rabbit = Rabbit()
# 调用 speak 方法
cat.speak() # 调用 Cat 类重载后的 speak
dog.speak() # 调用 Dog 类重载后的 speak
rabbit.speak() # Rabbit 没有定义 speak,调用父类的 speak
# 抚摸宠物
def fondle(pet:Pet):
pet.speak() # 会根据实际类型调用
# 抚摸宠物
fondle(cat)
fondle(dog)
fondle(rabbit)
这段代码中的抚摸函数 fondle
的形式参数 pet
的类型是基类 Pet
,通过 pet
调用 speak
时,会根据实际类型调用。
这种以统一的接口实现不同行为的特性称为 多态(Polymorphism)。
#super
如果子类重写了构造函数,那么它需要在构造函数中调用父类的构造函数来初始化继承的属性。Python 中可以通过 super
函数获取父类。
class Pet:
"""
宠物类
"""
def __init__(self, name:str):
"""
构造函数
参数:
name(str): 名字
"""
self.name = name
class Cat(Pet):
"""
猫类,继承宠物类
"""
def __init__(self, name:str, breed:str):
"""
构造函数
参数:
name(str): 名字
breed(str): 品种
"""
super().__init__(name) # 调用父类的构造函数
self.breed = breed # 创建新的属性
# 创建对象
cat = Cat("Tom", "Chartreux")
print(cat.name)
print(cat.breed)