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

liftword4周前 (04-28)技术文章9

在 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多继承父类参数问题)

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

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

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

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

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

Python C3算法多重继承顺序解析机制

在Python的面向对象编程中,多重继承是一个强大而复杂的特性。为了解决多重继承中方法解析顺序的问题,Python采用了C3线性化算法。本文将深入探讨C3算法的原理、实现机制及其在实际开发中的应用。C...

Python类继承的详细指南(python 类 继承)

在没学习 Python之前,我们经常听说它是面向对象的,他是怎么体现的呢?要想学好python这个技术,掌握类的建立和使用肯定是学好python的关键之一。我们先看看怎么建立类,知道怎么建,才好去用吧...

Python 进阶突破面向对象——继承(Inheritance)详解

继承是面向对象编程的四大支柱之一,它允许我们基于现有类创建新类,新类会继承父类的属性和方法,同时可以添加或修改功能。一、继承的基本概念1. 基本语法class ParentClass: # 父...