У меня есть «generi c class», который реализует «generi c members»
Затем отметьте его как таковой:
from typing import Generic, TypeVar
_T = TypeVar('_T', bound='ParentProvider')
class Parent(Generic[_T], metaclass=abc.ABCMeta):
@property
@abc.abstractmethod
def providerType(self) -> typing.Type[_T]:
pass
@property
@abc.abstractmethod
def providerKwargs(self) -> typing.Dict[str, typing.Any]:
pass
@property
def provider(self) -> _T:
return self.providerType(**self.providerKwargs)
@abc.abstractmethod
def useIt(self) -> None:
pass
Теперь спецификация c Child
impl становится:
class Child(Parent[ChildProvider]):
@property
def providerType(self) -> typing.Type[ChildProvider]:
return ChildProvider
@property
def providerKwargs(self) -> typing.Dict[str, typing.Any]:
return dict(who='world')
def useIt(self) -> None:
print(self.provider.p)
Как избежать следующей ошибки?
error: Too many arguments for "ParentProvider" [call-arg]
Подпись Parent.__init__
не разрешить передачу любых аргументов - вы можете ослабить это с помощью
class ParentProvider(metaclass=abc.ABCMeta):
def __init__(self, *args, **kwargs) -> None:
pass
(или просто
class ParentProvider(metaclass=abc.ABCMeta):
def __init__(self, **kwargs) -> None:
pass
, если вы не хотите разрешать передачу позиционных аргументов в конструкторы провайдеров).