Python isinstance() 语法
isinstance() 是 Python 的一个内置函数,它用于判断一个对象是否属于某个类或其子类。
语法:
isinstance(object, classinfo)说明:
isinstance() 函数接收以下 2 个参数。
object(必选):它是一个对象。classinfo(必选):它是一个类型名、类名或者 “由类型名或类名组成的元组”。如果 classinfo 是一个元组,则 isinstance() 会检查 object 是否是元组中任何一个类型的实例。
如果 isinstance() 函数的判断结果是 “属于”,则返回 True;如果判断结果是 “不属于”,则返回 False。
| 类型名 | 说明 |
|---|---|
| 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() | 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