如何在 Python 中检查一个类是否为另一个类的子类

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何在 Python 中检查一个类是否是另一个类的子类。这涉及探索类继承,这是面向对象编程中的一个基本概念。

你将首先创建一个父类 Animal,它包含一个构造函数和一个 speak 方法。然后,你将创建从 Animal 类继承的子类 DogCat,并覆盖 speak 方法。最后,你将学习如何使用 issubclass() 函数并检查 __bases__ 属性来确定子类关系。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") python/ObjectOrientedProgrammingGroup -.-> python/inheritance("Inheritance") subgraph Lab Skills python/build_in_functions -.-> lab-559501{{"如何在 Python 中检查一个类是否为另一个类的子类"}} python/classes_objects -.-> lab-559501{{"如何在 Python 中检查一个类是否为另一个类的子类"}} python/inheritance -.-> lab-559501{{"如何在 Python 中检查一个类是否为另一个类的子类"}} end

探索类继承

在这一步中,你将学习类继承,这是面向对象编程(OOP)中的一个基本概念。继承允许你创建新的类(子类),这些类可以从现有的类(父类)继承属性和方法。这有助于促进代码复用,并有助于构建更有条理、更易于维护的代码。

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

## Create a file named animal.py in the ~/project directory
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("Generic animal sound")

打开你的 VS Code 编辑器,在 ~/project 目录下创建一个名为 animal.py 的新文件。将上述代码复制并粘贴到该文件中。这个类有一个 __init__ 方法(构造函数),用于初始化 name 属性,还有一个 speak 方法,用于打印通用的动物叫声。

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

## Add the following code to animal.py
class Dog(Animal):
    def speak(self):
        print("Woof!")

将上述代码添加到 animal.py 文件中。Dog 类通过在类名后面的括号中指定 Animal 来继承自 Animal 类。Dog 类还重写了 speak 方法,以提供自己的特定实现。

接下来,让我们创建另一个名为 Cat 的子类,它同样继承自 Animal 类:

## Add the following code to animal.py
class Cat(Animal):
    def speak(self):
        print("Meow!")

将上述代码添加到 animal.py 文件中。Cat 类也继承自 Animal 类,并重写了 speak 方法。

现在,让我们创建一个主程序来使用这些类:

## Create a file named main.py in the ~/project directory
from animal import Animal, Dog, Cat

animal = Animal("Generic Animal")
dog = Dog("Buddy")
cat = Cat("Whiskers")

animal.speak()
dog.speak()
cat.speak()

~/project 目录下创建一个名为 main.py 的新文件,并将上述代码复制并粘贴到该文件中。这个程序从 animal.py 文件中导入 AnimalDogCat 类。然后,它创建每个类的实例并调用它们的 speak 方法。

要运行这个程序,在 VS Code 中打开终端并导航到 ~/project 目录:

cd ~/project

然后,使用 Python 命令执行 main.py 脚本:

python main.py

你应该会看到以下输出:

Generic animal sound
Woof!
Meow!

这展示了 DogCat 类如何从 Animal 类继承,并为 speak 方法提供自己的特定实现。这是 Python 中类继承的一个基本示例。

使用 issubclass() 函数

在这一步中,你将学习如何使用 issubclass() 函数来检查一个类是否是另一个类的子类。这是 Python 的一个内置函数,如果第一个参数是第二个参数的子类,则返回 True,否则返回 False

继续上一步的示例,让我们使用 issubclass() 函数来检查 AnimalDogCat 类之间的关系。

打开你的 VS Code 编辑器,在 ~/project 目录下创建一个名为 issubclass_example.py 的新文件。将以下代码复制并粘贴到该文件中:

## Create a file named issubclass_example.py in the ~/project directory
from animal import Animal, Dog, Cat

print(issubclass(Dog, Animal))
print(issubclass(Cat, Animal))
print(issubclass(Dog, Cat))
print(issubclass(Animal, Dog))
print(issubclass(Animal, Animal))

这个程序从你在上一步创建的 animal.py 文件中导入 AnimalDogCat 类。然后,它使用 issubclass() 函数来检查以下关系:

  • DogAnimal 的子类吗?
  • CatAnimal 的子类吗?
  • DogCat 的子类吗?
  • AnimalDog 的子类吗?
  • Animal 是其自身的子类吗?

要运行这个程序,在 VS Code 中打开终端并导航到 ~/project 目录:

cd ~/project

然后,使用 Python 命令执行 issubclass_example.py 脚本:

python issubclass_example.py

你应该会看到以下输出:

True
True
False
False
True

这个输出表明:

  • DogAnimal 的子类(True)
  • CatAnimal 的子类(True)
  • Dog 不是 Cat 的子类(False)
  • Animal 不是 Dog 的子类(False)
  • Animal 是其自身的子类(True)

issubclass() 函数对于检查代码中类之间的继承关系很有用。这有助于确保代码按预期运行,并编写更健壮、更易于维护的代码。

检查 __bases__ 属性

在这一步中,你将学习如何检查类的 __bases__ 属性,以找出其直接父类。__bases__ 属性是一个元组,其中包含了该类的父类。

继续上几步的示例,让我们来检查 AnimalDogCat 类的 __bases__ 属性。

打开你的 VS Code 编辑器,在 ~/project 目录下创建一个名为 bases_example.py 的新文件。将以下代码复制并粘贴到该文件中:

## Create a file named bases_example.py in the ~/project directory
from animal import Animal, Dog, Cat

print(Dog.__bases__)
print(Cat.__bases__)
print(Animal.__bases__)

这个程序从你之前步骤中创建的 animal.py 文件中导入 AnimalDogCat 类。然后,它会打印出每个类的 __bases__ 属性。

要运行这个程序,在 VS Code 中打开终端并导航到 ~/project 目录:

cd ~/project

然后,使用 Python 命令执行 bases_example.py 脚本:

python bases_example.py

你应该会看到以下输出:

(<class 'animal.Animal'>,)
(<class 'animal.Animal'>,)
(<class 'object'>,)

这个输出表明:

  • Dog 类继承自 Animal 类。
  • Cat 类继承自 Animal 类。
  • Animal 类继承自 object 类,object 类是 Python 中所有类的基类。

__bases__ 属性对于理解类的继承层次结构很有用。这有助于调试和编写更易于维护的代码。

总结

在这个实验中,你探索了 Python 中的类继承,这是面向对象编程中的一个关键概念。你创建了一个父类 Animal,它包含一个构造函数和一个 speak 方法,然后定义了从 Animal 继承的子类 DogCat

这些子类重写了 speak 方法,以提供它们自己的特定实现,展示了继承如何实现代码复用和专业化。最后,你创建了这些类的实例,并调用它们的 speak 方法,以观察不同的输出。