Como posso digitar uma dica de que o tipo de retorno de um método de alguma classe abstrata é alguma instância dessa classe?
Minha resposta intuitiva é que
@abstractmethod
def mymethod() -> typing.Self:
pass
deveria ser a maneira correta (como sugerido neste post , por exemplo). Mas quando agora subclassifico desta classe, o tipo de retorno é restrito ao tipo da classe filha. Qual é a maneira correta de digitar hint aqui, para que cada subclasse da classe pai seja permitida?
Código de exemplo:
from abc import ABC, abstractmethod
from typing import Self, override
import random
class DiceResult(ABC):
@abstractmethod
def reroll(self) -> Self:
pass
class NaturalTwenty(DiceResult):
@override
def reroll(self) -> DiceResult: # Type checkers report an error here
return random.choice([NaturalTwenty(), NaturalOne()])
class NaturalOne(DiceResult):
@override
def reroll(self) -> DiceResult: # Type checkers report an error here
return random.choice([NaturalTwenty(), NaturalOne()])