为何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
相关产品推荐
相关产品推荐

