page contents

看类型还是认家族?Python 的两种类型判断

Python 中的 type() 和 isinstance() 都能用于类型判断,但两者关注的问题不同。type() 适合确认对象的精确类型,isinstance() 适合判断对象是否属于某个类型体系。

attachments-2026-09-uyUanDD66a9e174992964.pngPython 中的 type() 和 isinstance() 都能用于类型判断,但两者关注的问题不同。

type() 适合确认对象的精确类型,isinstance() 适合判断对象是否属于某个类型体系。

type() 精确判断

只传入一个参数时,type() 返回对象所属的类型对象,而不是类型名称字符串。

age = 30

print(type(age))          # <class 'int'>
print(type(age) is int)   # True
print(type(age).__name__) # int

类型本身也是对象,因此可以直接使用 is 与目标类型比较。

price = 99.0

if type(price) is float:
    print("price 是精确的 float 类型")

type(obj) is Target 只接受精确匹配,不会把 Target 的子类视为相同类型。

class Animal:
    pass


class Dog(Animal):
    pass


dog = Dog()

print(type(dog) is Dog)     # True
print(type(dog) is Animal)  # False

虽然可以写 type(value) == int,但比较类型身份时通常使用 is,意图更明确。

isinstance() 体系判断

isinstance(obj, Class) 返回布尔值,并将继承关系纳入判断。

dog = Dog()

print(isinstance(dog, Dog))     # True
print(isinstance(dog, Animal))  # True
print(isinstance(dog, object))  # True

第二个参数可以是类型元组。对象只要匹配其中任意一种类型,结果就是 True。

value = 99.5

print(isinstance(value, (int, float)))  # True

这比重复书写多个判断更适合表达“允许多种类型”的业务规则。

# 不推荐:判断重复
if isinstance(value, int) or isinstance(value, float):
    print("有效数字")

# 推荐:集中声明允许的类型
if isinstance(value, (int, float)):
    print("有效数字")

第二个参数必须是类型、类型组成的元组,或当前 Python 版本支持的联合类型,否则会触发 TypeError。

高频判断误区

不要在常规业务判断中使用 type(obj) is BaseClass 判断基类。子类对象会被错误排除。

animal = Dog()

print(type(animal) is Animal)      # False
print(isinstance(animal, Animal))  # True

bool 是 int 的子类,因此布尔值也会通过整数的 isinstance() 判断。

print(isinstance(True, bool))  # True
print(isinstance(True, int))   # True
print(type(True) is int)       # False

如果业务要求“必须是整数,但不能是布尔值”,需要额外排除 bool,或使用精确类型判断。

value = True

is_strict_integer = isinstance(value, int) and not isinstance(value, bool)
print(is_strict_integer)  # False

不要通过比较类型名称字符串完成类型判断。名称可能重复,也会丢失继承关系。

# 不推荐
if type(value).__name__ == "int":
    print("整数")

# 根据业务语义选择
if isinstance(value, int):
    print("整数或 int 的子类")

仅为了决定对象能否完成某项操作时,类型判断也未必是最佳方案。Python 常根据对象是否支持所需协议来编写代码。

def print_length(value):
    try:
        print(len(value))
    except TypeError:
        print("该对象不支持长度操作")

规范使用标准

类型

语法

本质

使用场景

Python 精确类型

type(value) is int

比较对象的直接类型身份

必须排除子类的严格判断

Python 类型体系

isinstance(value, int)

判断类型及其继承关系

常规参数校验、业务分支

Python 多类型

isinstance(value, (int, float))

匹配元组中的任一类型

接受多种合法类型

Python 类型获取

type(value)

返回类型对象

调试、日志、运行时检查

常规 Python 业务代码优先使用 isinstance()。只有明确要求对象必须是某个精确类型时,才使用 type(obj) is Target。

实战代码示例

下面以订单金额校验为例:允许整数及浮点数,但明确拒绝会被视为整数子类的布尔值。

def validate_amount(amount):
    is_number = isinstance(amount, (int, float))
    is_boolean = isinstance(amount, bool)

    if not is_number or is_boolean:
        raise TypeError("amount must be an int or float")

    if amount < 0:
        raise ValueError("amount must not be negative")

    return float(amount)


print(validate_amount(99))    # 99.0
print(validate_amount(99.5))  # 99.5

# validate_amount(True)
# TypeError: amount must be an int or float

如果系统允许自定义数值子类,isinstance() 会保留扩展能力;额外排除 bool 则保证业务语义准确。

核心总结

type(obj) 返回类型对象,不是类型名称字符串

type(obj) is Target 只判断精确类型,不接受子类

isinstance(obj, Target) 会结合继承关系判断,通常更适合业务代码

isinstance() 可接收类型元组,用于集中判断多种合法类型

bool 是 int 的子类,严格数字校验时需要特别处理

精简记忆:查精确类型用 type(),查类型体系用 isinstance()。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

  • 发表于 2026-09-07 09:46
  • 阅读 ( 46 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2420 篇文章

作家榜 »

  1. Pack 2420 文章
  2. 轩辕小不懂 2403 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 216 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章