Скала запечатана в питоне - PullRequest
0 голосов
/ 03 ноября 2019

Как я могу получить преимущества от запечатанного класса в Python от scala? То есть, чтобы сделать возможным создание подкласса класса только в модуле, в котором он определен.

Примечание , а не дублирование в этом посте . C # sealed эквивалентно scala final.

Примером, где я мог бы захотеть это, является определение типа массива и определение в этом типе его формы следующим образом

from typing import final, TypeVar, Generic
from abc import ABC, abstractmethod

S = TypeVar('S', bound=Shape)


class Array(ABC, Generic[S]):
    @abstractmethod
    def shape(self) -> S:
        pass


class Shape(ABC):  # how to make this sealed, or similar?
    pass


@final
class Shape1(Shape):
    pass


@final
class Shape2(Shape):
    pass


def fn(arr: Array[Shape2]):
    # some calculation that requires it to be a rank-2 array

Как таковой, кто-то может унаследовать от Shape и создать свою собственную форму ранга 2, которая не будет принята fn, даже если она действительна (конечно, это не всегда хорошая идея, нопользователи могут делать то, что им нравится).

Другие примеры делают правильные перечисления. Я знаю, что не существует сопоставления с образцом, но я думаю, что было бы непонятно определить тип Either и сделать кто-то третий подкласс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...