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

时间:2018-02-08 16:18:53

标签: ptvs

我正在使用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

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

1 个答案:

答案 0 :(得分:1)

实现这一目标的最佳方法是查看类的MRO并检查每个基类定义。

这一系列步骤应该大部分时间都在工作 - PTVS不会假装进行静态分析质量类型推理,所以有很多情况下它会“放弃”(特别是当交叉时)模块导入开始变得复杂):

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