Код: Выделить всё
import abc
class ABCParent(metaclass=abc.ABCMeta):
def __init__(self, a: str, sibling_type: type[ABCParent]) -> None:
self.a = a
self._sibling_type = sibling_type
def new_sibling(self, a: str) -> ABCParent:
return self._sibling_type(a)
class ChildA(ABCParent):
def __init__(self, a: str) -> None:
super().__init__(a, ChildB)
class ChildB(ABCParent):
def __init__(self, a: str) -> None:
super().__init__(a, ChildA)
Код: Выделить всё
src/demo_problem.py: note: In member "new_sibling" of class "ABCParent":
src/demo_problem.py:10:16:10:36: error: Missing positional argument "sibling_type" in call to "ABCParent" [call-arg]
return self._sibling_type(a)
Мне удалось чтобы обойти проблему, используя typing.Union дочерних классов:
Код: Выделить всё
import abc
import typing
TConcreteChild: typing.TypeAlias = typing.Union["ChildA", "ChildB"]
class ABCParent(metaclass=abc.ABCMeta):
def __init__(self, a: str, sibling_type: type[TConcreteChild]) -> None:
...
- Это предполагает определение псевдонима типа (), что в противном случае бесполезно.
Код: Выделить всё
TConcreteChild
- Определение этого псевдонима необходимо обновить, если определено больше дочерних классов.
- Это предполагает определение типов до определения классов, поэтому требуются прямые ссылки с использованием строк (и, следовательно, он не может использовать новый синтаксис ChildA | ChildB).
Подробнее здесь: https://stackoverflow.com/questions/790 ... -different