代码之家  ›  专栏  ›  技术社区  ›  LOST

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

  •  0
  • LOST  · 技术社区  · 8 年前

    我正在使用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 analysis 和 FunctionDefinition node . 我也试过了 Body.StartIndex 和 "super(A, self)." + node.Name .

    出乎意料的是,这不会产生任何结果。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Zooba Necrolis    8 年前

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

    这一系列步骤 应该 大部分时间都可以工作-PTV不会假装进行静态分析质量类型推断,因此在很多情况下它会“放弃”(尤其是当跨模块导入开始变得复杂时):

    1. 查找的类型 self 在功能范围内(确保位置在功能范围内)
    2. 发现 ClassInfo.Mro
    3. 发现 自己 在MRO中(应首先),然后检查每个 ClassInfo.ClassDefinition 节点以查看它是否包含函数,或 BuiltinClassInfo.PythonType.GetMember() 对于导入的定义