1) Чтобы исправить проблему с автодополнением, можно указать тип переменной `cls` как `Type[AbstractCls]`, чтобы IDE знала, что она является экземпляром класса `AbstractCls`. Это можно сделать следующим образом:
cls: Type[AbstractCls] = AbstractCls.get_cls()
Теперь IDE будет корректно подсказывать методы и атрибуты класса `AbstractCls`.
2) К сожалению, автоматические подсказки для методов класса `A` не будут появляться без переопределения `get_cls()` в самом классе `A`. Это связано с тем, что статические методы и методы класса не наследуются от родительского класса, и IDE не сможет автоматически определить, какие методы доступны для экземпляров класса `A`. Поэтому, чтобы иметь автодополнение для методов класса `A`, необходимо переопределить `get_cls()` в классе `A`, как вы уже указали в комментарии в коде.
@classmethod
def get_cls(cls) -> Type['A']:
return super().get_cls()
Теперь IDE будет предоставлять автодополнение для методов класса `A` при использовании переменной `o`.