判断类型为什么用is instance 而不推荐用type

来源:5-12 如何判断变量的值、身份与类型

取识者

2022-06-19

视频的最后老师进行了解释,但是没有听清楚,所以请解释下,谢谢!
PS:看了下之前的问答,好像是说type 不能判断子类属于哪种类型,但是is instance 一样也不能判断属于哪种类型啊,那个is instance (a,{str,int,float}的结果也只是会出现true ,而不是告知属于哪个类啊?
写回答

2回答

才建涛

2024-04-11

搜索完成

在 Python 中,isinstance() 函数和 type() 函数都可以用于判断对象的类型,但它们在功能和使用场景上存在一些关键区别,这也是为何在很多情况下推荐使用 isinstance() 而非 type() 来进行类型检查的原因:

1. 处理继承关系:

• isinstance() 考虑对象的继承关系。当判断一个对象是否属于某个类或其子类时,isinstance() 返回 True,即使对象的实际类型是被检查类的派生类。这对于支持多态性(polymorphism)的编程非常有用,允许函数或方法接受父类作为参数类型,同时能够处理任何子类实例,增强了代码的灵活性和可扩展性。

• 相比之下,type() 更为严格,它仅检查对象的精确类型,而不考虑继承关系。如果对象是被检查类的子类实例,type() 仍将返回 False,这可能导致代码过于僵化,不适应类型层次结构的变化。

2. 类型检查的意图表达:

• 使用 isinstance() 明确表达了代码对对象类型的期望是基于接口(即对象需要具备的特定行为或属性),而非具体的实现细节(即对象的精确类型)。这种做法符合面向对象编程的原则,即关注对象的行为而非其所属的具体类别。

• 使用 type() 进行类型检查时,可能暗示着代码对对象类型的判断过于具体,没有充分考虑到对象可能具备的多态能力。这可能导致代码难以适应未来的设计变更,如添加新的子类或调整类型层次结构。

3. 代码可读性和意图表达:

• isinstance() 的调用形式 isinstance(obj, class_or_tuple) 直观地传达了“检查对象 obj 是否是 class_or_tuple 类型或其子类”的意图。特别是当提供一个元组作为第二个参数时,可以一次性检查对象是否属于多个类或接口之一,增强了代码的可读性。

• type(obj) == SomeClass 的形式虽然简单直观,但其意图可能不够明显,尤其是对于不熟悉代码的读者,可能需要额外思考才能理解作者是否期望处理子类情况。

4. 异常处理和程序健壮性:

• 在某些情况下,使用 isinstance() 可以避免不必要的 TypeError 异常。例如,当预期某个函数参数应该是某种可迭代对象时,使用 isinstance(arg, Iterable) 比直接尝试对 arg 进行迭代(如在 for 循环中)并在运行时捕获 TypeError 更加优雅和明确。

• 直接使用 type() 进行类型检查后进行类型转换或其他操作时,如果没有正确处理非预期类型,可能导致程序在运行时抛出异常。相比之下,isinstance() 提供了一种更安全的方式来检查对象是否满足特定类型要求,有助于提高代码的健壮性。

综上所述,isinstance() 更适合进行类型检查,因为它:

• 考虑了继承关系,支持多态性。

• 更好地表达了代码对对象行为的期望而非具体类型。

• 具有更清晰的意图表达和更好的代码可读性。

• 有助于提高代码的健壮性,减少不必要的运行时异常。

尽管如此,type() 也有其适用场景,比如当确实需要精确判断对象的底层类型,或者在创建新类、进行元编程等涉及类型操作的高级用法中。在这些情况下,使用 type() 是恰当且必要的。总的来说,选择 isinstance() 还是 type() 应视具体需求和上下文而定。

1
0

7七月

2022-06-19

没太理解你的问题,is instance 后面的类型不就是告诉你是哪个类型了吗

0
0

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14640 学习 · 4477 问题

查看课程