解释Python类的继承与实例化

2025年3月4日 | 阅读 7 分钟

Python 面向对象编程导论

Python 面向对象编程 (OOP) 的基础概念是继承和实例化。继承通过允许新类继承现有类的属性和函数,实现了代码重用和分层组织。扩展或替换其父类(也称为超类或基类)行为的新类称为子类或派生类。反之,实例化类(一种对象)的过程称为该操作。要访问类蓝图中定义的属性和方法,必须通过调用类来创建类的新、唯一的实例。

理解继承

继承是面向对象编程 (OOP) 的基本概念之一,它使得分层结构和代码重用成为可能。它包括创建一个新类,该类继承现有类的属性和方法,该现有类称为超类或基类。这个新类称为子类或派生类。通过继承,子类可以访问超类的所有公共和保护成员(属性和方法)。这意味着子类可以在无需重新定义的情况下使用和扩展超类的功能。由于继承鼓励模块化和抽象,因此可以创建扩展更通用类功能的专用类。

语法

  • 作为父类或基类的 BaseClass 包含可继承的属性和方法。
  • 从 BaseClass 派生的子类或派生类称为 DerivedClass。
  • 在 DerivedClass 后面括号中指定 BaseClass,表示 DerivedClass 继承自 BaseClass。
  • 派生类可以通过定义自己特有的属性和方法来扩展其功能。
  • 派生类可以通过重新定义源类中同名的方法来选择性地覆盖这些方法。

让我们通过 Python 中的示例来说明继承的概念。

示例 1

输出

 
Animal speaks
Dog barks   

说明

这段 Python 代码演示了面向对象编程中的一个重要概念——继承。它定义了两个类:Dog 和 Animal。基类 Animal 有一个名为 talk() 的方法,该方法会输出“Animal speaks”。Dog 类是 Animal 的子类,继承了它的所有属性和函数。然而,Dog 类通过打印“Dog barks”而不是调用其自身的实现来重写了 talk() 函数。

代码执行期间,创建了两个实例——一个是 Dog 类的实例(dog),另一个是 Animal 类的实例(animal)。调用 animal.speak() 函数时,会调用 Animal 类中的 speak() 方法,并打印“Animal speaks”。另一方面,dog.speak() 通过调用 Dog 类中重写过的 talk() 方法来打印“Dog barks”。这说明了子类可以通过继承来重用和修改其超类的行为。

示例 2

输出

 
Area of rectangle: 20
Area of circle: 28.274333882308138   

说明

这段 Python 代码展示了继承和多态性。它定义了一个基类 Shape,其中有一个用于重写的方法 area(),以及一个初始化 color 属性的构造函数。Rectangle 和 Circle 是 Shape 的两个子类。它们根据各自的几何特性,提供了自己的 area() 实现。Rectangle 和 Circle 对象在构造时计算并返回各自的面积。当计算宽度为 5、高度为 4 的矩形面积时,square.area() 返回 20。使用公式 π * r^2,area() 计算半径为 3 的圆的面积。结果约为 28.2743。这表明继承通过允许子类继承基类的属性和方法,同时提供自己独特的功能,从而促进了面向对象编程中的代码重用和可扩展性。

理解实例化

在面向对象编程中,实例化是创建类实例的过程。它涉及根据类的设计设置对象的内存并初始化其属性。通过实例化创建一个对象,该对象保留其个体性,同时继承类指定的属性。这赋予了对象自己的身份和行为。这种技术通过允许使用预设的结构和行为来简化代码的模块化、可重用性和组织性。实例化是面向对象设计的核心理念,它允许多个对象交互和组合以创建复杂的系统。

语法

  • 面向对象编程中的实例化是创建类的唯一实例的过程。
  • 使用 ClassName() 语法为对象分配内存并初始化其属性。
  • 这使得可以利用预设的结构和行为,从而促进代码的模块化、可重用性和组织性。

让我们看一个使用 Python 说明实例化概念的示例。

示例

输出

 
Toyota Camry
Tesla Model S   

说明

提供的 Python 示例定义了一个具有 brand 和 model 属性的 Car 类。当实例化一个新的 Car 对象时,__init__ 方法将其属性设置为初始值。然后,使用 Car("brand", "model") 的实例化语法,创建了两个具有不同品牌和型号组合的 Car 对象(car1 和 car2)。每个对象都有唯一的品牌和型号值。最后,使用点表示法(object.attribute)检索并打印每个对象的属性。这说明了实例化——创建 Car 类的不同实例,每个实例都具有一组独特的属性——的概念。通过允许从相同的类设计生成具有不同属性的多个对象,实例化有利于代码的结构化和可重用性,因为数据和行为被封装在各个对象中。

理解继承与实例化的区别

在以下部分,我们将以表格形式讨论 Python 类继承与实例化的区别,如下所示:

序号。继承实例化
1一种子类从超类继承方法和属性的方法。创建类的对象,即实例。
2促进代码重用,并创建具有相似属性的类层次结构。
子类能够扩展或特化超类的行为。
使用类蓝图分配对象内存并初始化其属性。
促进代码的模块化、可重用性和结构化。
3在超类和其子类之间创建“is-a”关系。在类和对象之间创建“has-a”关系。
4允许子类继承超类的属性和方法,从而促进代码重用。生成类的独立实例(对象),每个实例都有自己的状态。
5建立类之间的分层框架,鼓励专业化和模块化。根据类蓝图分配内存,并初始化每个对象的特征。
6在类之间建立层次结构,鼓励专业化和模块化。通过将数据和行为封装到独立对象中,促进代码的组织和重用。
7允许向子类添加新方法,并覆盖超类中的方法。创建“has-a”关系,反映对象及其类的唯一身份。
8专注于改进和扩展相关类中已有的功能。通过促进系统中各种对象的交互和组合来实现复杂行为。

结论

总而言之,继承和实例化都是面向对象编程中的基本概念,各有其特定功能。通过允许子类继承超类的属性和方法,继承促进了代码重用和层次结构的创建。它鼓励专业化和模块化,加强了类之间的“is-a”联系。然而,实例化涉及内存分配、根据类蓝图初始化属性以及创建类的实例(对象)。它通过允许创建具有不同状态的自主对象来促进数据和行为的封装、结构化和重用。虽然实例化处理单个实例的生成,但继承侧重于类之间的功能共享和扩展,从而能够通过组件的交互和组合来构建复杂的系统。这些概念是面向对象设计的基石,有助于创建高效、可扩展且可维护的软件。继承鼓励专业化和层次结构,而实例化则生成独立的实例,从而实现模块化。虽然实例化创建了独立的实例,促进了模块化和封装,但继承促进了代码重用和层次结构。这些基本概念促进了面向对象系统中组织、专业化和可扩展性,从而促进了高效的软件开发。