Python 中如何判断一个对象的类型?
Python 判断对象类型用 type() 获取精确类型,用 isinstance() 做类型检查(推荐,支持继承关系),issubclass() 检查类之间的继承。本文对比三者用法。
获取对象的精确类型用 type(obj);做类型判断推荐 isinstance(obj, 类型)——它把子类也算作父类的实例,符合面向对象语义,是写条件分支时的标准做法。
type():查看精确类型
x = 10
print(type(x)) # <class 'int'>
print(type(x) is int) # True
type() 返回对象的类,用 is 比较时不考虑继承——子类实例不会被判定为父类类型。
isinstance():类型检查的首选
print(isinstance(10, int)) # True
print(isinstance(True, int)) # True!bool 是 int 的子类
class A: pass
class B(A): pass
print(isinstance(B(), A)) # True,子类实例算父类
第二个参数还可以是元组:isinstance(x, (int, float)),任一匹配即 True。
issubclass():检查类之间的继承
print(issubclass(B, A)) # True
print(issubclass(A, B)) # False
用于类与类的比较,而不是实例。
更 Pythonic 的思路:鸭子类型
很多场景不该检查类型,而是检查"有没有需要的方法":
# 与其 isinstance(x, list),不如:
if hasattr(x, '__iter__'):
...
"如果它走像鸭子、叫像鸭子,那它就是鸭子。"这样代码对自定义类型更友好。
常见问题(FAQ)
Q:为什么 isinstance(True, int) 是 True?
A:Python 中 bool 继承自 int,True == 1。需要严格区分时用 type(x) is bool 或把 bool 的判断放在前面。
Q:type(x) is int 和 isinstance(x, int) 选哪个?
A:绝大多数情况选 isinstance,它尊重继承体系,和多态兼容;只有明确要求"必须就是这个类、子类也不行"时才用 type() is。
Q:如何检查是不是字符串?
A:isinstance(x, str)。别用 type(x) == type("") 这种绕路写法。