Как я могу получить преимущества от запечатанного класса в 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
и сделать кто-то третий подкласс.