判断类型为什么用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() 应视具体需求和上下文而定。
10 -
7七月
2022-06-19
没太理解你的问题,is instance 后面的类型不就是告诉你是哪个类型了吗
00
相似问题