推荐使用 isinstance() 判断对象类型,因其支持继承和鸭子类型;慎用 type() 直接比较,因不识别子类且违背多态;泛化判断宜用 collections.abc 等抽象基类;type(obj).__name__ 仅用于调试展示。

在 Python 中判断对象类型,最常用且推荐的方式是使用 isinstance() 函数,而不是直接比较 type()。这是因为 isinstance() 支持继承关系,更符合 Python 的“鸭子类型”哲学,也更健壮。
用 isinstance() 判断类型(推荐)
它能正确识别子类实例,适用于大多数场景:
-
isinstance(obj, int)→ 判断是否为整数(包括bool,因为bool是int的子类) -
isinstance(obj, (str, bytes))→ 判断是否为字符串或字节串(支持元组传入多个类型) -
isinstance(obj, list)→ 判断是否为列表 - 自定义类也适用:
isinstance(obj, MyClass)
用 type() 直接比较(慎用)
type(obj) is int 或 type(obj) == list 虽然能工作,但不推荐,原因:
- 无法识别子类:若
MyList继承自list,type(my_list) is list返回False - 写法冗长,可读性差
- 与 Python 的多态设计相悖
检查是否为某类的实例(含抽象基类)
对容器、可迭代对象等,推荐用标准库的抽象基类(ABC),更语义化:
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
立即学习“Python免费学习笔记(深入)”;
-
from collections.abc import Iterable→isinstance(obj, Iterable) -
from collections.abc import Mapping→ 判断是否为字典类结构(如dict、defaultdict) -
from numbers import Number→ 判断是否为任意数字类型(int、float、Decimal等)
需要获取具体类型名时用 type().__name__
仅用于日志、调试或展示,不用于逻辑判断:
-
type(obj).__name__→ 返回字符串,如'str'、'datetime' -
type(obj).__qualname__→ 对嵌套类更准确(如'A.B') - 注意:
type(obj).__name__ == 'str'不等于isinstance(obj, str),尤其对第三方类型或别名不安全
基本上就这些。日常开发中,优先用 isinstance();需要泛化判断容器行为时,用 collections.abc 中的抽象类;仅调试时才查 __name__。不复杂但容易忽略细节。










