Python 的内置函数 isinstance() 用于检查一个对象是否属于指定的类型或类型元组。它是 Python 类型检查的重要工具,比传统的 type() 函数更灵活,支持继承关系的判断。
基本语法
isinstance(object, classinfo)
功能特点
-
类型检查:可以检查对象是否是特定类型
isinstance(42, int) # 返回 True -
继承关系判断:会考虑类的继承关系
class Parent: pass class Child(Parent): pass obj = Child() isinstance(obj, Parent) # 返回 True -
多类型检查:通过类型元组可以同时检查多种类型
isinstance([1, 2, 3], (list, tuple)) # 返回 True
与 type() 的区别
type()不考虑继承关系,只返回对象的确切类型isinstance()会考虑继承关系,更适用于面向对象编程
实际应用场景
-
参数类型验证:
def calculate_area(radius): if not isinstance(radius, (int, float)): raise TypeError("半径必须是数字") return 3.14 * radius ** 2 -
多态处理:
def process_data(data): if isinstance(data, str): return data.upper() elif isinstance(data, (list, tuple)): return [str(item) for item in data] -
接口兼容性检查:
def save_to_file(obj): if isinstance(obj, (str, bytes)): # 处理字符串或字节数据 pass elif hasattr(obj, 'read') and callable(obj.read): # 处理文件类对象 pass
注意事项
- 对于布尔值,
isinstance(True, int)会返回True,因为bool是int的子类 - 在 Python 3 中,字符串检查应该使用
str而不是basestring(Python 2) - 对于抽象基类(ABC),
isinstance()也能正确识别实现了相应接口的类
性能考虑
isinstance() 是一个相对高效的操作,但在性能关键的代码中,过度使用类型检查可能会影响性能。通常建议只在接口边界或需要确保类型安全的地方使用。