Я хочу, чтобы реализации моего абстрактного класса принимали целое число. Для этого я могу
from abc import ABC, abstractmethod
class Base(ABC):
@abstractmethod
def __init__(self, i: int):
pass
и тогда реализации будут похожи на
class Sub(Base):
def __init__(self, i: int):
...
но так как я могу изменить подпись __init__
, не нарушая LSP, я также могу
class Sub2(Sub):
def __init__(self, s: str):
...
и подпись Base.__init__
потеряна и не применяется ABC
. То есть только прямые потомки Base
должны иметь одинаковую подпись __init__
. Если бы подклассы строго требовались для вызова методов __init__
суперкласса, это не было бы проблемой, потому что Sub2
должен был бы обеспечить int
до Sub
, но на самом деле это необязательно.
Имеет ли это смысл делать абстрактное __init__
? Или, в более широком смысле, следует ли ожидать, что подклассы будут иметь заданную сигнатуру типа?