Python - 继承

什么是Python中的继承?

继承是面向对象编程(OOP)中的一个基本概念,它允许一个类继承另一个类的属性和方法。这可以实现代码的重用性和模块化,因为您可以在现有类的基础上创建新类,而无需再次编写相同的代码。在Python中,继承是通过使用class关键字后跟父类名称的括号来实现的。

Python - Inheritance

创建父类

让我们从创建一个名为Animal的简单父类开始:

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

    def speak(self):
        raise NotImplementedError("子类必须实现这个方法")

在这个例子中,我们定义了一个Animal类,它有一个__init__方法来初始化name属性,以及一个speak方法,该方法会引发一个NotImplementedError。如果子类没有提供自己的speak方法实现,则会引发此错误。

创建子类

现在,让我们创建一个名为Dog的子类,它从Animal类继承:

class Dog(Animal):
    def speak(self):
        return f"{self.name} 说汪!"

Dog类继承了Animal类的所有属性和方法,但它提供了自己的speak方法实现。当我们创建Dog类的一个实例并调用其speak方法时,它将返回"[狗的名字]说汪!",而不是引发错误。

my_dog = Dog("Buddy")
print(my_dog.speak())  # 输出: Buddy 说汪!

继承的类型

Python中有三种继承类型:单继承、多继承、多级继承和层次继承。我们将在下面详细探讨每种类型。

Python - 单继承

单继承是最常见的继承形式,其中一个类只从一个父类继承。如我们上面所看到的,Dog类从Animal类继承,这就是单继承的一个例子。

Python - 多继承

多继承是指一个类从多个父类继承。然而,Python并不直接通过类定义语法支持多继承。相反,它使用一种称为“mixins”或“interfaces”的技术来实现多继承。

方法解析顺序(MRO)

Python使用C3线性化算法来确定在查找方法时搜索基类的顺序。MRO确保每个类在方法解析顺序中最多出现一次,并且它保持了类定义中指定的基类顺序。

Python - 多级继承

多级继承发生在一个类从一个子类继承时,形成一个类的层次结构。以下是一个例子:

class Mammal(Animal):
    pass

class Cat(Mammal):
    def speak(self):
        return f"{self.name} 说喵!"

在这个例子中,Cat类从Mammal类继承,而Mammal类又从Animal类继承。这形成了一个多级继承层次结构。

Python - 层次继承

层次继承涉及多个子类从一个超类继承。例如:

class Reptile(Animal):
    pass

class Snake(Reptile):
    def speak(self):
        return f"{self.name} 说嘶!"

class Lizard(Reptile):
    def speak(self):
        return f"{self.name} 说爬!"

在这个例子中,SnakeLizard类都从Reptile类继承,而Reptile类又从Animal类继承。这形成了一个层次继承结构。

Python - 混合继承

混合继承结合了多继承和其他继承类型的特性。Python不直接支持混合继承,但可以通过mixins或结合不同类型的继承来实现。

super() 函数

super()函数用于在子类中调用父类的方法。当您想要扩展或覆盖父类的方法,同时仍然保留其部分功能时,它特别有用。以下是一个例子:

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

    def speak(self):
        return f"{self.name} 说啾啾!"

在这个例子中,Bird类从Animal类继承,并使用super()函数调用父类的__init__方法。这确保了name属性被正确初始化。此外,Bird类提供了自己的speak方法实现。

my_bird = Bird("Tweety", 10)
print(my_bird.speak())  # 输出: Tweety 说啾啾!

通过使用继承,您可以创建更专业的类,这些类继承并扩展其父类的功能,从而促进代码的重用性和组织性。请记住,继承只是OOP的一个方面,还有其他概念如多态性、封装和抽象,它们在设计健壮和可维护的软件系统中也起着至关重要的作用。

Credits: Image by storyset