首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 的 isinstance 到底查了什么:拆开 __instancecheck__、ABC 缓存和 type 的区别

Python 的 isinstance 到底查了什么:拆开 __instancecheck__、ABC 缓存和 type 的区别

作者头像
小小张说故事
发布于 2026-11-15 19:23:30
发布于 2026-11-15 19:23:30
80
举报
概述
isinstance 不是自己翻 MRO,它把判断委托给第二个参数的类对象:普通 type 走默认实现,ABCMeta 换了一套带缓存、带 __subclasshook__、带 register 虚拟子类的实现。本文用本机 CPython 3.13.14 实测 __instancecheck__ 必须定义在 metaclass 上、register 不进 MRO、伪造 __class__ 能骗过 isinstance、20 万次性能差 4.4 倍,附对照表与七条排错清单

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、先跑四组反直觉结果
  • 二、第一次写 __instancecheck__,我写错了
  • 三、isinstance 到底问了谁
  • 四、register 出来的虚拟子类:不进 MRO
  • 五、__subclasshook__:只看有没有那个方法
  • 六、性能:默认路径几乎免费,自定义路径慢 4 倍多
  • 七、字节码层面:一个普通 CALL,一个专用指令
  • 八、对照表
  • 九、七条排错清单
  • 结语
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档