You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python无法正确显示sqlite3.Cursor父类信息?如何正确获取?

为什么sqlite3.Cursor的__base__显示为object,却被判定为Iterator子类?

问题原因

sqlite3.Cursor是CPython中用C语言实现的扩展类,和纯Python类的继承逻辑有差异:

  • 你看到的class Cursor(Iterator[Any]):只是静态类型标注代码,并非运行时实际的继承关系;
  • Iterator是Python的抽象基类(ABC),它通过__subclasshook__机制,自动把实现了迭代器核心方法(__next__和__iter__)的类判定为子类。而sqlite3.Cursor正好实现了这些方法,所以issubclass(sqlite3.Cursor, Iterator)返回True;
  • __base__属性只返回类的直接显式父类,这种通过ABC机制判定的“虚拟子类”不会被计入,因此显示<class 'object'>。

正确获取继承关系的方法

  • 查看显式继承链:用__mro__属性查看方法解析顺序,它会列出所有显式继承的父类(对于C扩展类的Cursor,通常只有object):
    import sqlite3
    print(sqlite3.Cursor.__mro__)
    # 输出示例:(<class 'sqlite3.Cursor'>, <class 'object'>)
    
  • 确认抽象基类关联:直接使用issubclass()或isinstance()来判断是否属于某个ABC的子类,这是抽象基类设计的标准用法;
  • 验证核心方法实现:如果想确认为什么被判定为Iterator子类,可以检查它是否实现了迭代器必需的方法:
    print(hasattr(sqlite3.Cursor, "__next__"))  # 输出True
    print(hasattr(sqlite3.Cursor, "__iter__"))  # 输出True
    

内容的提问来源于stack exchange,提问作者kurt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:32:13