Как определить, когда функция переопределяет другую в цепочке наследования?
Я использую сборки 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
При обработке вира А я попытался сделать это:
analysis.GetValuesByIndex("super()." + node.Name, node.Body.EndIndex)
Вот, ModuleAnalysis analysis
а также FunctionDefinition node
, Я тоже пробовал Body.StartIndex
а также "super(A, self)." + node.Name
,
Неожиданно это не дает результатов.
1 ответ
Лучший способ добиться этого - взглянуть на MRO класса и проверить каждое определение базового класса.
Эта последовательность шагов должна работать большую часть времени - PTVS не претендует на то, чтобы делать вывод типа качества статического анализа, поэтому во многих ситуациях он "сдается" (особенно, когда импорт между модулями начинает усложняться):
- Найти тип
self
внутри функции (убедитесь, что местоположение находится в пределах области действия функции) - найти
ClassInfo.Mro
- найти
self
в MRO (должен быть первым), а затем после этого проверять каждыйClassInfo.ClassDefinition
узел, чтобы увидеть, содержит ли он функцию, илиBuiltinClassInfo.PythonType.GetMember()
для импортированного определения