Python 中如何判断一个对象的类型?

Python 判断对象类型用 type() 获取精确类型,用 isinstance() 做类型检查(推荐,支持继承关系),issubclass() 检查类之间的继承。本文对比三者用法。

最佳实践
Python 中如何判断一个对象的类型?封面

获取对象的精确类型用 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 继承自 intTrue == 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("") 这种绕路写法。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台