Как определить, когда функция переопределяет другую в цепочке наследования?

Я использую сборки 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 не претендует на то, чтобы делать вывод типа качества статического анализа, поэтому во многих ситуациях он "сдается" (особенно, когда импорт между модулями начинает усложняться):

  1. Найти тип self внутри функции (убедитесь, что местоположение находится в пределах области действия функции)
  2. найти ClassInfo.Mro
  3. найти self в MRO (должен быть первым), а затем после этого проверять каждый ClassInfo.ClassDefinition узел, чтобы увидеть, содержит ли он функцию, или BuiltinClassInfo.PythonType.GetMember() для импортированного определения
Другие вопросы по тегам