type()函数如何推断对象类型?关于isinstance(obj1, type(obj2))的疑问
关于
type()与isinstance(obj1, type(obj2))的疑问解答 1. type()函数的类型推断逻辑
type(obj)会直接返回对象obj所属的最具体(精确)的类——也就是创建该对象时对应的那个类,绝对不会返回它的祖先类。举个实际例子:
class Parent: pass class Child(Parent): pass child_obj = Child() print(type(child_obj)) # 输出 <class '__main__.Child'>,而非Parent
不管继承层级有多深,type()只返回对象直接归属的类。
2. type()返回的类型会不会是祖先类?
不会。只有当对象本身就是祖先类的实例时,type()才会返回祖先类。比如:
parent_obj = Parent() print(type(parent_obj)) # 输出 <class '__main__.Parent'>
如果对象是子类实例,type()永远只会指向子类,和父类无直接关联。
3. 用isinstance(obj1, type(obj2))的实际效果
这个写法本质是检查obj1是否是obj2的精确类型,或者该类型的子类的实例。看几个场景:
# 场景1:两个对象是同一类的实例 obj1 = Child() obj2 = Child() print(isinstance(obj1, type(obj2))) # True # 场景2:obj1是obj2类型的父类实例 obj3 = Parent() print(isinstance(obj3, type(obj2))) # False # 场景3:obj1是obj2类型的子类实例 obj4 = Child() obj5 = Parent() print(isinstance(obj4, type(obj5))) # True
如果你只是想判断两个对象的精确类型完全相同,直接用type(obj1) is type(obj2)更直观;如果允许obj1是obj2类型的子类实例,isinstance(obj1, type(obj2))才是合适的写法。
内容的提问来源于stack exchange,提问作者snufsan
相关产品推荐
相关产品推荐

