如何在 Python 中检查对象是否为类的实例

PythonPythonBeginner
立即练习

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

简介

在这个实验中,你将探索 Python 中的类和实例,并学习如何检查一个对象是否是某个类的实例。你将首先创建一个带有类属性和实例属性的 Dog 类,然后创建 Dog 类的实例并访问它们的属性。

接着,你将学习使用 isinstance() 进行类型检查,并将其与 type() 进行精确匹配比较。这将使你能够确定一个对象是否属于某个特定类或该类的子类,从而更深入地理解 Python 中的面向对象编程。


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/constructor("Constructor") python/ObjectOrientedProgrammingGroup -.-> python/inheritance("Inheritance") subgraph Lab Skills python/build_in_functions -.-> lab-559613{{"如何在 Python 中检查对象是否为类的实例"}} python/classes_objects -.-> lab-559613{{"如何在 Python 中检查对象是否为类的实例"}} python/constructor -.-> lab-559613{{"如何在 Python 中检查对象是否为类的实例"}} python/inheritance -.-> lab-559613{{"如何在 Python 中检查对象是否为类的实例"}} end

探索类和实例

在这一步中,你将学习 Python 中的类和实例。类就像是创建对象的蓝图,而实例则是根据这些蓝图创建的实际对象。理解类和实例是 Python 面向对象编程的基础。

首先,让我们创建一个名为 Dog 的简单类。

  1. 在 LabEx 环境中打开 VS Code 编辑器。

  2. ~/project 目录下创建一个名为 dog.py 的新文件。

    ~/project/dog.py
  3. 将以下代码添加到 dog.py 中:

    ## Define a class called Dog
    class Dog:
        ## Class attribute
        species = "Canis familiaris"
    
        ## Instance attribute
        def __init__(self, name, age):
            self.name = name
            self.age = age

    在这里,我们定义了一个名为 Dog 的类。species 是一个类属性,这意味着它由 Dog 类的所有实例共享。__init__ 方法是一个特殊的方法,称为构造函数。当创建一个新的 Dog 对象时,它用于初始化实例属性 nameage

  4. 现在,让我们创建 Dog 类的实例。将以下代码添加到 dog.py 的末尾:

    ## Create instances of the Dog class
    buddy = Dog("Buddy", 9)
    miles = Dog("Miles", 4)
    
    ## Access instance attributes
    print(f"{buddy.name} is {buddy.age} years old.")
    print(f"{miles.name} is {miles.age} years old.")
    
    ## Access class attribute
    print(f"{buddy.name} is a {buddy.species}.")
    print(f"{miles.name} is a {miles.species}.")

    在这部分,我们创建了 Dog 类的两个实例:buddymiles。然后,我们使用点号表示法 (.) 访问它们的实例属性 (nameage) 以及类属性 (species)。

  5. 要运行 dog.py 脚本,请在 VS Code 中打开一个终端并执行以下命令:

    python dog.py

    你应该会看到以下输出:

    Buddy is 9 years old.
    Miles is 4 years old.
    Buddy is a Canis familiaris.
    Miles is a Canis familiaris.

    这个输出确认你已经成功创建了 Dog 类的实例并访问了它们的属性。

使用 isinstance() 进行类型检查

在这一步中,你将学习如何使用 Python 中的 isinstance() 函数来检查一个对象是否是某个特定类的实例。这是确保你的代码能够正确处理不同类型对象的有用工具。

基于上一步的 Dog 类,让我们创建一个新的 Python 文件来探索 isinstance()

  1. 在 LabEx 环境中打开 VS Code 编辑器。

  2. ~/project 目录下创建一个名为 type_check.py 的新文件。

    ~/project/type_check.py
  3. dog.py 中的 Dog 类定义复制到 type_check.py 中。此时,你的 type_check.py 文件应该如下所示:

    class Dog:
        species = "Canis familiaris"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
  4. 现在,让我们添加一些代码来使用 isinstance() 函数。将以下代码添加到 type_check.py 的末尾:

    ## Create instances of the Dog class
    buddy = Dog("Buddy", 9)
    miles = Dog("Miles", 4)
    
    ## Check if buddy is an instance of the Dog class
    print(isinstance(buddy, Dog))
    
    ## Check if miles is an instance of the Dog class
    print(isinstance(miles, Dog))
    
    ## Check if a string is an instance of the Dog class
    print(isinstance("Hello", Dog))

    在这里,我们创建了 Dog 类的两个实例 buddymiles。然后,我们使用 isinstance() 函数来检查这些实例是否为 Dog 类型。我们还检查了字符串 "Hello" 是否为 Dog 类的实例。

  5. 要运行 type_check.py 脚本,请在 VS Code 中打开一个终端并执行以下命令:

    python type_check.py

    你应该会看到以下输出:

    True
    True
    False

    输出结果表明,buddymiles 确实是 Dog 类的实例,而字符串 "Hello" 不是。

使用 type() 进行精确匹配比较

在这一步中,你将学习如何使用 Python 中的 type() 函数,并将其与用于类型检查的 isinstance() 函数进行比较。isinstance() 用于检查一个对象是否是某个类或其子类的实例,而 type() 则返回对象的确切类型。

为了说明两者的区别,让我们创建 Dog 类的一个子类,然后使用 isinstance()type() 来检查实例的类型。

  1. 在 LabEx 环境中打开 VS Code 编辑器。

  2. 修改 ~/project 目录下的 type_check.py 文件。

    ~/project/type_check.py
  3. 添加一个名为 GermanShepherd 的新类,它继承自 Dog 类。此时,你的 type_check.py 文件应该如下所示:

    class Dog:
        species = "Canis familiaris"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    class GermanShepherd(Dog):
        def __init__(self, name, age, training_level):
            super().__init__(name, age)
            self.training_level = training_level

    在这里,GermanShepherdDog 类的子类。它从 Dog 类继承了 nameage 属性,并添加了一个新属性 training_level

  4. 现在,让我们添加一些代码来使用 isinstance()type() 函数。将以下代码添加到 type_check.py 的末尾:

    ## Create instances of the Dog and GermanShepherd classes
    buddy = Dog("Buddy", 9)
    sparky = GermanShepherd("Sparky", 3, "Advanced")
    
    ## Check types using isinstance()
    print(f"buddy isinstance Dog: {isinstance(buddy, Dog)}")
    print(f"sparky isinstance Dog: {isinstance(sparky, Dog)}")
    print(f"sparky isinstance GermanShepherd: {isinstance(sparky, GermanShepherd)}")
    
    ## Check types using type()
    print(f"type(buddy) == Dog: {type(buddy) == Dog}")
    print(f"type(sparky) == Dog: {type(sparky) == Dog}")
    print(f"type(sparky) == GermanShepherd: {type(sparky) == GermanShepherd}")

    在这部分,我们创建了 Dog 类的一个实例 (buddy) 和 GermanShepherd 类的一个实例 (sparky)。然后,我们使用 isinstance()type() 来检查它们的类型。

  5. 要运行 type_check.py 脚本,请在 VS Code 中打开一个终端并执行以下命令:

    python type_check.py

    你应该会看到以下输出:

    buddy isinstance Dog: True
    sparky isinstance Dog: True
    sparky isinstance GermanShepherd: True
    type(buddy) == Dog: True
    type(sparky) == Dog: False
    type(sparky) == GermanShepherd: True

    输出结果显示,isinstance(sparky, Dog) 返回 True,因为 sparkyGermanShepherd 类的实例,而 GermanShepherdDog 类的子类。然而,type(sparky) == Dog 返回 False,因为 type(sparky) 返回的确切类型是 GermanShepherd,而不是 Dog

总结

在本次实验中,你探索了 Python 中类和实例的基础知识。你学习了如何定义一个类,包括类属性以及在 __init__ 构造函数中初始化的实例属性。

接着,你创建了 Dog 类的实例,并为它们的特定属性赋值。最后,你使用点号表示法访问了实例属性(如 nameage)和类属性(如 species),展示了如何获取与对象及其类相关的信息。