如何确定函数何时覆盖继承链中的另一个函数?

How to determine when function overrides another in the chain of inheritance?

我正在使用 PTVS 程序集为 Python 库生成强类型绑定。我有一个 ModuleAnalysis 的实例,我用它来执行有关 Python 代码中猜测类型的各种查询。

此时我偶然发现我的 C# 输出需要用 override 关键字显式标记所有被覆盖的方法。但是,我似乎无法弄清楚如何确定父 类 中的一个是否已经有一个同名的成员,该成员正在被覆盖。

这是我尝试转换的示例:

class Base:
    def virt(self):
        print("Base.virt")

class A(Base):   
    def virt(self):
        super().virt()

    def non_virt(self):
        pass

在处理A的virt时,我尝试这样做:

analysis.GetValuesByIndex("super()." + node.Name, node.Body.EndIndex)

这里,ModuleAnalysis analysisFunctionDefinition node。我也尝试了 Body.StartIndex"super(A, self)." + node.Name.

出乎意料的是,这没有结果。

实现此目的的最佳方法是查看 class 的 MRO 并检查每个基础 class 定义。

这一系列步骤 应该 大多数时候都有效 - PTVS 不会假装进行静态分析质量类型推断,因此在很多情况下 "gives up"(特别是当 cross-module 导入开始变得复杂时):

  1. 在函数内查找self的类型(确保位置在函数范围内)
  2. 查找ClassInfo.Mro
  3. 在 MRO 中找到 self(应该是第一个),然后检查每个 ClassInfo.ClassDefinition 节点以查看它是否包含函数,或者 BuiltinClassInfo.PythonType.GetMember() 用于导入的定义