Обеспечение безопасности типов между конкретными подклассами абстрактного базового класса в PythonPython

Программы на Python
Anonymous
Обеспечение безопасности типов между конкретными подклассами абстрактного базового класса в Python

Сообщение Anonymous »

В моем проекте Python я столкнулся с проблемой безопасности типов, связанной с абстрактным базовым классом (AbstractClass) и его конкретными подклассами (ConcreteClassA и ConcreteClassB). Каждый конкретный класс реализует абстрактные методы из AbstractClass, но я изо всех сил пытаюсь обеспечить безопасность типов между двумя конкретными классами.
Вот упрощенная версия моей структуры кода:

Код: Выделить всё

class AbstractClass(ABC):
class rational:
pass

@dataclass
class Frac(rational):
value1: int
value2: int

@dataclass
class Whole(rational):
value: int

@classmethod
@abstractmethod
def foo(cls, x: int, y: int) -> rational:
pass

@classmethod
@abstractmethod
def boo(cls, r: rational) -> str:
pass

class ConcreteClassA(AbstractClass):
@classmethod
def foo(cls, x: int, y: int) -> AbstractClass.rational:
...

@classmethod
def boo(cls, r: AbstractClass.rational) -> str:
...

class ConcreteClassB(AbstractClass):
@classmethod
def foo(cls, x: int, y: int) -> AbstractClass.rational:
...

@classmethod
def boo(cls, r: AbstractClass.rational) -> str:
...

a = ConcreteClassA.boo(ConcreteClassB.foo(9, -6))
b = ConcreteClassB.boo(ConcreteClassA.foo(9, -6))
Несмотря на структуру, между ConcreteClassA и ConcreteClassB не обеспечивается безопасность типов. Например, вызовы типа ConcreteClassA.foo с аргументами ConcreteClassB.boo не приводят к какой-либо ошибке, что нежелательно.
Я использую Pyright для проверки типов. Как я могу изменить свой код, чтобы гарантировать возникновение ошибок при передаче данных между ConcreteClassA и ConcreteClassB? Обратите внимание: я предпочитаю не добавлять дженерики, псевдонимы типов или другие конструкции непосредственно в основной класс. Будем признательны за любые предложения и идеи!
А также реализацию @dataclss внутри AbstractClass, просто используйте ее.

(Цели обучения)

Подробнее здесь: https://stackoverflow.com/questions/783 ... lass-in-py

Вернуться в «Python»