Имеет ли смысл абстрактный `def __init__` в Python? - PullRequest
2 голосов
/ 08 мая 2019

Я хочу, чтобы реализации моего абстрактного класса принимали целое число. Для этого я могу

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__? Или, в более широком смысле, следует ли ожидать, что подклассы будут иметь заданную сигнатуру типа?

...