Skip to main content

继承

Python 中的继承(Inheritance)是面向对象编程(OOP)中最重要的概念之一,它允许一个类(子类)从另一个类(父类)继承属性和方法,从而提高代码的复用性和可扩展性。

1.继承的基本语法

Python 使用 class 子类(父类): 的方式实现继承。

class Animal:
def __init__(self, name):
self.name = name

def speak(self):
return "动物在叫"


# 定义子类(继承自 Animal)
class Dog(Animal):
def speak(self): # 重写父类方法
return "汪汪汪"


# 创建对象
dog = Dog("旺财")
print(dog.name) # 继承了 Animal 的 name 属性
print(dog.speak()) # 调用子类重写的方法,输出:汪汪汪

👆 说明:

  • Dog 继承了 Animal,因此 Dog 具有 Animal 的所有属性和方法。
  • Dog 重新定义了 speak() 方法,覆盖了 Animal 的 speak() 方法(方法重写)。

2.super()关键字:调用父类方法

如果子类需要 在重写方法的同时调用父类的方法,可以使用 super()

class Animal:
def __init__(self, name):
self.name = name

def speak(self):
return "动物在叫"


class Cat(Animal):
def __init__(self, name, color):
super().__init__(name) # 调用父类的 __init__
self.color = color # 子类新增属性

def speak(self):
return super().speak() + ",但我是猫,我会喵喵叫"


cat = Cat("小花", "白色")
print(cat.name, cat.color) # 继承 name, 新增 color
print(cat.speak()) # 先调用父类 speak(),再扩展

🔹 说明:

  • super().__init__(name) 调用父类的构造方法,避免重复代码。
  • super().speak() 调用父类的方法,然后在子类中扩展。

3.多级继承

Python 允许一个类继承另一个子类,形成 继承链

class Animal:
def speak(self):
return "动物发出声音"


class Mammal(Animal): # 继承 Animal
def has_fur(self):
return "我是哺乳动物,有毛发"


class Dog(Mammal): # 继承 Mammal
def speak(self):
return "汪汪汪"


dog = Dog()
print(dog.speak()) # 汪汪汪(继承 Animal -> Mammal -> Dog)
print(dog.has_fur()) # 我是哺乳动物,有毛发

🔹 说明:

  • Dog 继承了 Mammal,而 Mammal 继承了 Animal,所以 Dog 既能调用 speak(),也能调用 has_fur()

4.多重继承

Python 支持多重继承,即一个子类可以 同时继承多个父类

class Animal:
def eat(self):
return "我会吃东西"


class Flyable:
def fly(self):
return "我会飞"


class Bird(Animal, Flyable): # 同时继承 Animal 和 Flyable
pass


bird = Bird()
print(bird.eat()) # 继承自 Animal
print(bird.fly()) # 继承自 Flyable

🔹 说明:

  • Bird 继承了 Animal 和 Flyable,因此可以 同时拥有 它们的方法。
  • 多重继承 可以让类更强大,但也可能导致 代码复杂性增加,需要合理使用。

5.isinstance()issubclass()

Python 提供了两个内置函数来检查继承关系:

  • isinstance(obj, Class):检查 obj 是否是 Class 或其子类的实例。
  • issubclass(SubClass, ParentClass):检查 SubClass 是否是 ParentClass 的子类。
class Animal: pass
class Dog(Animal): pass

dog = Dog()

print(isinstance(dog, Dog)) # True
print(isinstance(dog, Animal)) # True
print(issubclass(Dog, Animal)) # True
print(issubclass(Dog, object)) # True(所有类都继承自 object)

6.方法解析顺序(MRO)

在多重继承中,Python 需要确定调用方法时的顺序。Python 使用 **C3线性化(C3 Linearization)**规则,查找顺序遵循 MRO(Method Resolution Order)

class A:
def show(self):
print("A 类")

class B(A):
def show(self):
print("B 类")

class C(A):
def show(self):
print("C 类")

class D(B, C): # 多重继承
pass

d = D()
d.show() # B 类

# 查看 MRO 顺序
print(D.__mro__) # 输出:(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

🔹 MRO 解析规则:

  1. 优先搜索子类(最左优先),即先搜索 B,再搜索 C。
  2. 如果 B 和 C 都没有该方法,则搜索 A。
  3. 最终会搜索 object(Python 3 中所有类默认继承 object)。

7.抽象类(Abstract Class)

有时,我们希望某些类不能被实例化,只能作为基类(父类),可以使用 abc 模块定义抽象类

from abc import ABC, abstractmethod

class Animal(ABC): # 继承 ABC,使其变成抽象类
@abstractmethod
def speak(self): # 抽象方法,必须在子类中实现
pass

class Dog(Animal):
def speak(self):
return "汪汪汪"

# animal = Animal() # ❌ 抽象类不能被实例化
dog = Dog()
print(dog.speak()) # ✅ 子类实现了抽象方法,可以实例化

🔹 说明:

  • ABCAnimal 变成抽象类,不能直接实例化。
  • @abstractmethod 表示必须在子类中实现 speak(),否则子类也不能实例化。

查看类的调用方法的顺序

调用 类名.__mro__ 方法,可以查看该类的调用方法的顺序。

总结

继承类型描述
单继承子类继承一个父类
多级继承子类继承另一个子类
多重继承子类继承多个父类
方法重写子类重写父类方法
super()调用父类方法
MRO 机制确定方法查找顺序
抽象类定义模板类,子类必须实现抽象方法

继承提高了代码复用可扩展性,是 Python OOP 核心特性之一! 🚀