继承是面向对象编程的核心概念之一,它允许一个类(子类)继承另一个类(父类)的属性和方法。

基本语法

class ParentClass:
    # 父类的属性和方法
    pass

class ChildClass(ParentClass):  # 继承父类
    # 子类的属性和方法
    pass

继承的类型

1. 单继承

class A:
    pass

class B(A):  # B继承A
    pass

2. 多继承

class A:
    pass

class B:
    pass

class C(A, B):  # C同时继承A和B
    pass

3.多级继承(Multilevel Inheritance)

多级继承是指一个类继承自另一个类,而这个父类又继承自另一个类,形成层级结构。

class Grandparent:
    def grandparent_method(self):
        print("Grandparent method")

class Parent(Grandparent):
    def parent_method(self):
        print("Parent method")

class Child(Parent):
    def child_method(self):
        print("Child method")

# 使用示例
child = Child()
child.grandparent_method()  # 可以调用祖父类的方法
child.parent_method()       # 可以调用父类的方法
child.child_method()        # 可以调用自己的方法

方法重写

class Animal:
    def make_sound(self):
        print("Animal makes a sound")
    
    def eat(self):
        print("Animal is eating")

class Dog(Animal):
    # 重写父类的 make_sound 方法
    def make_sound(self):
        print("Dog barks: Woof! Woof!")
    
    # 不重写 eat 方法,继承父类的实现

# 使用示例
animal = Animal()
animal.make_sound()  # Animal makes a sound

dog = Dog()
dog.make_sound()     # Dog barks: Woof! Woof! (重写的方法)
dog.eat()            # Animal is eating (继承的方法)

方法扩展

调用父类,在父类基础上做扩展。

class Animal:
    def make_sound(self):
        print("Animal makes a sound")
    
    def sleep(self):
        print("Animal is sleeping")

class Dog(Animal):
    def make_sound(self):
        # 先调用父类的方法
        super().make_sound()
        # 然后添加新的功能
        print("Dog barks: Woof! Woof!")
        print("Tail is wagging")

# 使用示例
dog = Dog()
dog.make_sound()
# 输出:
# Animal makes a sound
# Dog barks: Woof! Woof!
# Tail is wagging

方法解析顺序(MRO)

Python使用C3算法来确定方法解析顺序:

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

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

d = D()
print(d.method())  # 输出: "B的方法"(按照MRO顺序)

特殊方法super

super()函数
python中有显式调用方法:super(子类名, self).方法()
用于调用父类的方法:

class Parent:
    def __init__(self, value):
        self.value = value

class Child(Parent):
    def __init__(self, value, extra):
        super().__init__(value)  # 调用父类的__init__
        self.extra = extra

继承的实用技巧

1. 检查继承关系

print(issubclass(Dog, Animal))  # True 检查类与类之间的继承关系
print(isinstance(my_dog, Animal))  # True 检查对象与类之间的关系

2. 抽象基类(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

注意事项

1、谨慎使用多继承:可能导致复杂的MRO和难以维护的代码

2、优先使用组合而不是继承:如果"有一个"关系比"是一个"关系更合适

3、遵循Liskov替换原则:子类应该能够替换父类而不影响程序正确性

更多推荐