python进阶突破象编程OOP的核心概念之一——继承(Inheritance)

liftword2周前 (04-28)技术文章2

在 Python 中,继承(Inheritance) 是面向对象编程(OOP)的核心概念之一,它允许一个类(子类)基于另一个类(父类)来构建,并继承其属性和方法。以下是 Python 继承的 深度解析,涵盖基础语法、高级用法和实际应用场景。


1. 继承的基本语法

1.1 单继承

子类继承父类的所有 非私有(不以 __ 开头的)属性和方法:

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

    def speak(self):
        return "声音"

class Dog(Animal):  # Dog 继承 Animal
    def speak(self):  # 方法重写(Override)
        return "汪汪!"

dog = Dog("旺财")
print(dog.name)     # 输出: 旺财(继承自 Animal.__init__)
print(dog.speak())  # 输出: 汪汪!(子类重写的方法)

1.2 继承的super()方法

super() 用于调用父类的方法,常用于 __init__:

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

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # 调用父类的 __init__
        self.breed = breed

dog = Dog("旺财", "金毛")
print(dog.name)   # 输出: 旺财(来自 Animal)
print(dog.breed)  # 输出: 金毛(来自 Dog)

2. 多重继承(Multiple Inheritance)

Python 支持 多继承,即一个子类可以继承多个父类:

class A:
    def method(self):
        return "A"

class B:
    def method(self):
        return "B"

class C(A, B):  # 多重继承(A 在前,B 在后)
    pass

c = C()
print(c.method())  # 输出: A(按 MRO 顺序调用)

2.1 方法解析顺序(MRO, Method Resolution Order)

Python 使用 C3 线性化算法 决定方法调用顺序:

print(C.__mro__)  # 输出: (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
  • 调用顺序:C → A → B → object(从左到右,深度优先)。

2.2 多继承的典型问题:钻石继承(Diamond Problem)

class A:
    def method(self):
        return "A"

class B(A):
    def method(self):
        return "B"

class C(A):
    def method(self):
        return "C"

class D(B, C):
    pass

d = D()
print(d.method())  # 输出: B(MRO: D → B → C → A)
print(D.__mro__)   # 输出: D, B, C, A, object

3. 继承的高级用法

3.1 抽象基类(Abstract Base Class, ABC)

Python 的 abc 模块允许定义 抽象方法,强制子类必须实现:

from abc import ABC, abstractmethod

class Shape(ABC):  # 抽象基类
    @abstractmethod
    def area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):  # 必须实现,否则报错
        return 3.14 * self.radius ** 2

# shape = Shape()  # 报错:不能实例化抽象类
circle = Circle(5)
print(circle.area())  # 输出: 78.5

3.2isinstance()和issubclass()

检查对象和类的继承关系:

class Animal: pass
class Dog(Animal): pass

dog = Dog()
print(isinstance(dog, Animal))  # True(Dog 是 Animal 的子类)
print(issubclass(Dog, Animal))  # True

3.3 动态继承

运行时动态继承(type() 或 __bases__ 修改):

class A: pass
class B: pass

# 动态创建类 C,继承 A 和 B
C = type('C', (A, B), {})
print(C.__mro__)  # 输出: C, A, B, object

4. 继承的最佳实践

4.1 何时使用继承?

适合继承的场景

  • "is-a" 关系(如 Dog 是 Animal)。
  • 需要复用父类的大部分方法。
  • 需要多态(子类可以替换父类)。

不适合继承的场景

  • "has-a" 关系(如 Car Engine,应该用组合,而不是继承)。
  • 父类经常变动(会导致子类不稳定)。

4.2 继承 vs. 组合

继承

组合

class Dog(Animal)

class Car: def __init__(self): self.engine = Engine()

强耦合

松耦合

适合 is-a 关系

适合 has-a 关系

推荐优先使用组合,除非明确需要继承。


5. 总结

特性

描述

单继承

class Child(Parent)

多继承

class Child(A, B)(注意 MRO)

super()

调用父类方法

抽象基类

@abstractmethod 强制子类实现

isinstance()

检查对象是否属于某类

动态继承

type() 或 __bases__ 修改

继承是 Python OOP 的核心,但 不要滥用,优先考虑 组合接口(抽象类)。

相关文章

三十二、Python类的继承与多继承详解

继承是面向对象的三大特征之一,也是实现软件复用的重要途径。Python中的继承机制是多继承机制,即一个子类可以同时有多个父类。1.继承的语法Python子类继承父类的语法是在定义子类时,将多个父类放在...

Python | 多继承(python多继承父类参数问题)

在Python中,类可以继承自多个类。这被称为多继承。多继承是一种非常强大的概念,它允许我们将多个类的功能组合到一个类中。在本文中,我们将使用一个简单的示例来说明多继承的概念。假设我们正在编写一个图形...

python多继承的3C算法是什么?怎么用?

有很多地方都说python多继承的继承顺序,是按照深度遍历的方式,其实python多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫3C算法python多继承的深度遍历cl...

python之多态、继承、重写篇(python多态的作用特点)

# -*- coding: UTF-8 -*- class Animal: def run(self): print("动物会跑。。") def sl...

Python 中的继承和多态(python多继承的顺序)

Python 中的继承是什么?Python 中的继承是一个特性,允许一个类(子类)使用另一个类(父类)的属性和方法。这有助于我们重用代码并避免重复。思考一下亲子关系:孩子继承了父母的某些特征,但也可以...

python继承与多态-多继承二义性和弊端

在Python中,多继承是一种同时从多个父类继承属性和方法的机制。然而,多继承也可能导致二义性和带来一些弊端。下面我们来详细说明这些问题。二义性(Ambiguity)当一个类从多个父类继承了相同的方法...