如何确定函数何时覆盖继承链中的另一个函数?
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 analysis
和 FunctionDefinition node
。我也尝试了 Body.StartIndex
和 "super(A, self)." + node.Name
.
出乎意料的是,这没有结果。
实现此目的的最佳方法是查看 class 的 MRO 并检查每个基础 class 定义。
这一系列步骤 应该 大多数时候都有效 - PTVS 不会假装进行静态分析质量类型推断,因此在很多情况下 "gives up"(特别是当 cross-module 导入开始变得复杂时):
- 在函数内查找
self
的类型(确保位置在函数范围内)
- 查找
ClassInfo.Mro
- 在 MRO 中找到
self
(应该是第一个),然后检查每个 ClassInfo.ClassDefinition
节点以查看它是否包含函数,或者 BuiltinClassInfo.PythonType.GetMember()
用于导入的定义
我正在使用 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
.
出乎意料的是,这没有结果。
实现此目的的最佳方法是查看 class 的 MRO 并检查每个基础 class 定义。
这一系列步骤 应该 大多数时候都有效 - PTVS 不会假装进行静态分析质量类型推断,因此在很多情况下 "gives up"(特别是当 cross-module 导入开始变得复杂时):
- 在函数内查找
self
的类型(确保位置在函数范围内) - 查找
ClassInfo.Mro
- 在 MRO 中找到
self
(应该是第一个),然后检查每个ClassInfo.ClassDefinition
节点以查看它是否包含函数,或者BuiltinClassInfo.PythonType.GetMember()
用于导入的定义