ZetCode

Python isinstance 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 isinstance 函数,该函数用于检查对象是否为类或类元组的实例。 我们将介绍基本用法、继承、抽象基类和实际示例。

基本定义

如果 object 参数是 classinfo 参数的实例,则 isinstance 函数返回 True。 它也适用于继承和抽象基类。

主要特征:检查对象类型、支持继承层次结构、接受类型元组,并通过注册与抽象基类一起使用。 比 type() 检查更灵活。

基本类型检查

以下是使用内置类型的简单示例,展示了 isinstance 如何针对单个类和类元组验证对象类型。

basic_isinstance.py
num = 42
name = "Alice"
values = [1, 2, 3]

print(isinstance(num, int))      # True
print(isinstance(name, str))     # True
print(isinstance(values, list))  # True

# With tuple of types
print(isinstance(num, (int, float)))  # True
print(isinstance(3.14, (int, float))) # True
print(isinstance("text", (int, float))) # False

此示例显示了 isinstance 与不同的内置类型一起使用的情况。 当对象与指定的类型匹配时,它返回 True

元组版本一次检查多种类型,如果任何类型匹配,则返回 True。 这比多个 or 条件更简洁。

继承检查

isinstance 适用于继承层次结构,将子类实例识别为父类的有效实例。 此示例演示了多态行为。

inheritance.py
class Animal:
    pass

class Dog(Animal):
    pass

class Cat(Animal):
    pass

my_dog = Dog()
my_cat = Cat()

print(isinstance(my_dog, Dog))    # True
print(isinstance(my_dog, Animal)) # True (inheritance)
print(isinstance(my_cat, Dog))    # False
print(isinstance(my_cat, Animal)) # True

该示例显示了 isinstance 如何尊重继承。 Dog 实例被认为是 DogAnimal

这种行为使 isinstancetype() 更适合用于多态性,因为它适用于整个类层次结构。

抽象基类

isinstance 适用于来自 collections.abc 模块的抽象基类 (ABC),检查接口兼容性。

abc_check.py
from collections.abc import Sequence, Iterable

my_list = [1, 2, 3]
my_dict = {'a': 1, 'b': 2}

print(isinstance(my_list, Sequence))  # True
print(isinstance(my_list, Iterable))  # True
print(isinstance(my_dict, Sequence))  # False
print(isinstance(my_dict, Iterable))  # True

这会检查对象是否实现了特定的抽象接口。 list 既是 Sequence 又是 Iterable,而 dict 仅是 Iterable

ABC 检查对于验证对象是否支持所需的操作(例如 Sequence 的索引)而无需检查具体类型很有用。

自定义类检查

你可以将 isinstance 与自定义类和多重继承一起使用。 此示例显示了复杂的类关系。

custom_classes.py
class Vehicle:
    pass

class Engine:
    pass

class Car(Vehicle, Engine):
    pass

class Boat(Vehicle):
    pass

my_car = Car()
my_boat = Boat()

print(isinstance(my_car, Vehicle))  # True
print(isinstance(my_car, Engine))   # True
print(isinstance(my_boat, Engine))  # False
print(isinstance(my_boat, (Engine, Vehicle)))  # True

该示例演示了多重继承检查。 Car 继承自 VehicleEngine,因此 isinstance 对两者都返回 True

元组检查显示了如何在一个操作中测试多个可能的基类,这比单独检查更简洁。

动态类型检查

此示例显示了运行时类型检查,在一个函数中使用 isinstance 以不同的方式处理不同的输入类型。

dynamic_check.py
def process_data(data):
    if isinstance(data, str):
        return f"Processed string: {data.upper()}"
    elif isinstance(data, (int, float)):
        return data * 2
    elif isinstance(data, dict):
        return {k.upper(): v for k, v in data.items()}
    else:
        return f"Unsupported type: {type(data).__name__}"

print(process_data("hello"))      # Processed string: HELLO
print(process_data(42))          # 84
print(process_data({'a': 1}))    # {'A': 1}
print(process_data([1, 2, 3]))   # Unsupported type: list

该函数使用 isinstance 来适当地处理不同的输入类型。 这种模式在需要接受多种类型的函数中很常见。

请注意它是如何使用元组检查处理数字类型,并为不支持的类型提供回退。 这比单独的函数更易于维护。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程