Привет
from abc import ABC
from random import choice
from typing import TypeVar
T = TypeVar('T', bound='AbstractCls')
class AbstractCls(ABC):
@classmethod
def get_cls(cls) -> type[T]:
return choice(cls.__subclasses__())
def m(self):
pass
class A(AbstractCls):
def m_a(self):
pass
# @classmethod
# def get_cls(cls) -> type['A']:
# return super().get_cls()
class B(AbstractCls):
pass
cls = AbstractCls.get_cls()
o = cls()
получая такое PyCharm выдает (Ctrl-Q) для cls и o:
cls: Type[T] = AbstractCls.get_cls()
o: Any = cls()
python 3.10
Из-за потери связи не работает автодополнение:
IDE не знает про AbstractCls.m() => не дает подсказок по аргументам, документации и т.д.
1) Можно это как-то пофиксить, чтобы работало будто указано
class AbstractCls(ABC):
@classmethod
def get_cls(cls) -> type['AbstractCls']:
...
cls: Type[AbstractCls] = AbstractCls.get_cls()
o: AbstractCls = cls()
?
2) Можно ли сделать так, чтобы подсказки вылезали и по методам класса А? Само собой если я укажу
cls = A.get_cls()
Автоматически без переопределения в самом классе ( поведение возникает, если get_cls() в нем раскомментирован)
З.Ы.
- choice просто для примера, по факту там возврат определенного класса по условиям
- реальный код содержит немного больше наследования, но в целом пример считаю похожим.