判断变量是否为某类实例首选isinstance(obj, MyClass),支持继承;需严格限定类本身时用type(obj) is MyClass;判断变量是否为类用inspect.isclass(obj)或isinstance(obj, type)。

在Python中,判断一个变量是否为某个类的实例(即“对象实例”),核心是区分“它是不是由这个类创建出来的”,而不是简单看它有没有属性或方法。关键在于用对函数、理解继承关系、明确检查意图。
用 isinstance() 判断是否为类的实例
这是最常用、最推荐的方式,专门为此设计:
- 语法:isinstance(obj, MyClass)
- 返回 True 当 obj 是 MyClass 的直接实例,或其任意子类的实例
- 支持元组形式一次性检查多个类型,如 isinstance(obj, (str, int, list))
- 符合 Python 的多态原则,能正确处理继承链
用 type() 判断是否为某类的精确实例
当你需要严格限定——只接受 MyClass 本身创建的对象,**不接受任何子类**时才用:
- 语法:type(obj) is MyClass(推荐用 is 而非 ==)
- type(obj) == MyClass 也能工作,但用 is 更准确(比较类型对象身份)
- 如果 obj 是 MyClass 的子类实例,type(obj) 返回的是子类,结果为 False
如何判断变量本身是不是一个“类”(而非实例)
有时需求是反向的:想确认传入的变量是不是一个可被实例化的类(比如做工厂函数或装饰器参数校验):
- 用 inspect.isclass(obj) —— 最清晰、最可靠
- 等价写法:isinstance(obj, type)(因为所有类都是 type 的实例)
- 避免用 callable() 或 try-except 实例化来推断,既不严谨也易出副作用
普通对象?所有变量在Python里本质上都是对象
Python 中一切皆对象,所以“是否为普通对象”这种说法本身不准确。实际想问的通常是:
- 是否为内置类型实例(如 int、str、list)?→ 用 isinstance(obj, (int, str, list))
- 是否为用户自定义类的实例?→ 用 isinstance(obj, object) 总是 True,应具体指定类名
- 是否为某种“非基本类型”的对象(如自定义类、函数、模块)?→ 可结合 type(obj).__module__ != 'builtins' 辅助判断

















