Python isinstance() 函数

Python isinstance() 语法

isinstance() 是 Python 的一个内置函数,它用于判断一个对象是否属于某个类或其子类。

语法:

isinstance(object, classinfo)

说明:

isinstance() 函数接收以下 2 个参数。

  • object(必选):它是一个对象。
  • classinfo(必选):它是一个类型名、类名或者 “由类型名或类名组成的元组”。如果 classinfo 是一个元组,则 isinstance() 会检查 object 是否是元组中任何一个类型的实例。

如果 isinstance() 函数的判断结果是 “属于”,则返回 True;如果判断结果是 “不属于”,则返回 False。

Python 类型名(常见类型)
类型名 说明
int 整数
float 浮点数
bool 布尔值
complex 复数
str 字符串
list 列表
tuple 元组
dict 字典
set 集合
bytes 不可变的二进制数据
bytearray 可变的二进制数据
frozenset() 不可变集合
NoneType None 类型

要注意的是,字符串的类型名是 str,而不是 string。

提示:

  • 如果 A 类(子类)继承自 B 类(父类),那么它也会被视为 B 类的实例。换一句话来说,如果一个对象是 A 类的实例,那么它也会被视为 B 类的实例。
  • isinstance() 推荐用于类型检查,因为它会考虑继承关系。而 type() 函数只检查对象的精确类型,不会考虑继承关系。

Python isinstance() 摘要

使用频率
官方文档 查看
相关函数 issubclass()type()

Python isinstance() 示例

接下来,我们通过几个简单的例子来讲解一下 Python isinstance() 函数是如何使用的。

示例 1:isinstance() 判断基本类型

# 数字
result1 = isinstance(666, int)
print(result1)

# 字符串
result2 = isinstance('绿叶网', str)
print(result2)

# 列表
result3 = isinstance([1, 2, 3], list)
print(result3)

# 元组
result4 = isinstance((1, 2, 3), tuple)
print(result4)

# 字典
result5 = isinstance({'Jack': 1001, 'Lucy': 1002}, dict)
print(result5)

# 字典
result6 = isinstance({'red', 'green', 'blue'}, set)
print(result6)

运行结果如下。

True
True
True
True
True
True

示例 2:isinstance() 的参数 type 是一个元组

result = isinstance('绿叶网', (int, str, list))
print(result)

运行结果如下。

True

分析:

'绿叶网' 是一个字符串,它属于 (int, str, list) 中的 str,因此 isinstance() 函数返回 True。

示例 3:isinstance() 会考虑继承关系

class Hero:
    name = '剑圣'

h = Hero()
print(isinstance(h, Hero))
print(isinstance(h, object))
print(isinstance(h, list))
print(isinstance(h, (list, tuple, Hero)))

运行结果如下。

True
True
False
True

分析:

h 是 Hero 类的实例,因此 isinstance(h,Hero) 会返回 True。

isinstance() 函数判断类型时,会考虑继承关系。由于 Hero 类是 object 类的子类,因此 isinstance(h, object) 会返回 True。

type() 与 isinstance() 的区别

type() 和 isinstance() 这两个函数的功能比较相似,但它们存在本质上的区别。

  • type():不考虑继承关系,它不会认为子类是一种父类类型。
  • isinstance():考虑继承关系,它会认为子类是一种父类类型。
type() vs isinstance()
type() isinstance()
是否考虑继承关系
是否支持多类型检查 是(通过元组参数)
推荐场景 精确匹配类型时使用 动态类型检查,或处理继承时使用

示例 4:type() vs isinstance()

class Parent: 
    pass
class Child(Parent): 
    pass

obj = Child()
print(type(obj) == Parent)          # 输出:False(type 不认继承)
print(isinstance(obj, Parent))      # 输出:True(isinstance 认继承)

运行结果如下。

False
True

常见问题

1. 如何判断一个对象是否为 None?

我们可以使用 2 种方式,一种是判断 obj is None(最为推荐),另一种是使用 isinstance(obj, type(None))(不推荐)。

2. 如何判断对象是多种容器类型中的一种?

当需要检查一个对象是否属于多个不同的容器类型(例如列表元组字典集合)中的任何一个时,我们可以给 isinstance() 函数的第 2 个参数传入一个类型元组,比如:

def is_collection(obj):
    return isinstance(obj, (list, tuple, dict, set))

print(is_collection([1, 2]))        # 输出:True

上一篇: type()

下一篇: issubclass()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号