如何识别 class 定义节点是否是另一个 class 的扩展

How to identify if a class definition node is an extension of another class

当我进入它的 ast 节点时,我需要确定 class 是否是另一个 class 的扩展。由于带有 super-class 的括号不属于 class 名称的一部分,因此我无法识别它。

if isinstance(class, ast.ClassDef):

在我知道我所在的那个节点是一个 class 定义之后,现在我需要知道这个 class 是否扩展了另一个,我应该怎么看?

让我们考虑一个简单的继承树

>>> src = """class C:pass\n\n\nclass D(C):pass\n\n\n"""

我们可以解析它并转储解析后的源代码以查看整体结构:

>>> parsed = ast.parse(src)
>>> ast.dump(parsed)
"Module(body=[ClassDef(name='C', bases=[], keywords=[], body=[Pass()], 
        decorator_list=[]), ClassDef(name='D', bases=[Name(id='C', ctx=Load())],
        keywords=[], body=[Pass()], decorator_list=[])])"

我们可以看到 D 是 "module" 正文中的第二个元素。

>>> cd = parsed.body[1]
>>> cd.name
'D'

而且我们可以剖析 Dbases 属性来找到它的超类。

>>> cd.bases[0].id
'C'