В этом разделе PEP, посвященном слиянию и расширению протоколов, утверждается, что
Общая философия заключается в том, что протоколы в основном похожи на обычные ABC,
но средство проверки статического типа будет обрабатывать их особым образом.
Таким образом, можно было бы ожидать наследования от подкласса typing.Protocol почти так же, как можно было бы ожидать наследования от подкласса abc.ABC:
Код: Выделить всё
from abc import ABC
from typing import Protocol
class AbstractBase(ABC):
def method(self):
print("AbstractBase.method called")
class Concrete1(AbstractBase):
...
c1 = Concrete1()
c1.method() # prints "AbstractBase.method called"
class ProtocolBase(Protocol):
def method(self):
print("ProtocolBase.method called")
class Concrete2(ProtocolBase):
...
c2 = Concrete2()
c2.method() # prints "ProtocolBase.method called"
Чтобы явно объявить, что определенный класс реализует заданный
протокол, он может использоваться как обычный базовый класс. В этом случае класс
может использовать реализации членов протокола по умолчанию.
...
Обратите внимание, что между явными и неявных
подтипов, основное преимущество явного создания подклассов заключается в том, что некоторые
методы протокола можно получить «бесплатно».
Однако, когда класс протокола реализует метод __init__, __init__ не наследуется явными подклассами класса протокола. В этом отличие от подклассов класса ABC, которые наследуют метод __init__:
Код: Выделить всё
from abc import ABC
from typing import Protocol
class AbstractBase(ABC):
def __init__(self):
print("AbstractBase.__init__ called")
class Concrete1(AbstractBase):
...
c1 = Concrete1() # prints "AbstractBase.__init__ called"
class ProtocolBase(Protocol):
def __init__(self):
print("ProtocolBase.__init__ called")
class Concrete2(ProtocolBase):
...
c2 = Concrete2() # NOTHING GETS PRINTED
Мои вопросы:
- В чем причина отсутствия наследования __init__ явными подтипами класса протокола? Есть ли какая-то теоретико-типовая причина, по которой классы протоколов не могут предоставлять метод __init__ «бесплатно»?
- Есть ли какая-либо документация, касающаяся этого несоответствия? Или это ошибка?
Подробнее здесь: https://stackoverflow.com/questions/627 ... type-const