bool 继承 int 是历史与设计的共同选择,旨在实现数值行为无缝兼容整数操作的同时保持逻辑语义清晰,其继承关系在运行时真实生效但仅限于数值行为。

bool 继承 int 是历史与设计的共同选择
Python 在 2002 年(PEP 285)引入 bool 类型时,明确要求它“在数值行为上无缝兼容 int”,而不是另起炉灶。这意味着 True 和 False 必须能直接参与加减、比较、位运算等所有整数操作,同时又能在逻辑上下文中清晰表达真假语义。最直接的实现方式就是让 bool 成为 int 的子类——既复用全部整数逻辑,又可通过类型系统区分用途。
isinstance(True, int) 返回 True 的实际含义
这句代码返回 True 不代表“True 就是 int”,而是说它的类型层级中 int 是父类。关键影响有三:
-
isinstance(x, int)对True和False都返回True;但type(x) is int只对纯整数成立,对bool实例返回False -
True + 1的结果类型是int,不是bool;同理not True返回False(仍是bool),但~True(按位取反)返回-2(int) - JSON 序列化、数据库字段映射等依赖类型判断的场景,若只检查
type(x) == bool,会漏掉布尔值参与算术后变成的int
小整数缓存让 True == 1 看似“同一对象”,其实不是
True == 1 是 True,但 True is 1 是 False。这是因为:
-
True是bool类型的单例对象,内存地址固定;1是缓存在[-5, 256]范围内的int实例,地址也固定 - 两者值相等、地址不同——
==比较值,is比较身份 - 小整数缓存只作用于
int对象,不扩展到bool;所以id(True) != id(1),哪怕它们都指向“1”这个数值概念
类型检查时容易忽略的隐式转换点
真正容易出问题的地方不在定义时,而在混合运算或鸭子类型判断中:
立即学习“Python免费学习笔记(深入)”;
-
sum([True, False, True])返回2(int),不是True;如果下游函数期望接收bool,这里就断链了 -
if x:中的x是True还是1,运行时表现一致;但if type(x) is bool:和if isinstance(x, bool):行为不同——后者能覆盖继承关系 - 用
json.dumps({"flag": True})输出"flag": true,靠的是json模块对bool的特判;如果先做True + 0得到1,再传进去,就会输出1而非true
复杂点在于:这种继承不是装饰性的,而是运行时真实生效的;但它的边界又很窄——仅限数值行为,不包括字符串表示、序列化规则或用户自定义方法。一旦离开算术上下文,bool 就必须被当作独立类型对待。


















