Но посмотрите на этот пример:
Код: Выделить всё
from typing import Protocol
class PortProto(Protocol):
@property
def port_id(self) -> str:
"""a read-only port id"""
class MyPortA:
port_id: str
class MyPortB(PortProto):
port_id: str
my_port_a = MyPortA()
my_port_a.port_id = "some_id"
print(my_port_a.port_id) # prints "some_id"
my_port_b = MyPortB()
my_port_b.port_id = "some_id" # raises "AttributeError: can't set attribute"
print(my_port_b.port_id)
Единственный Разница между MyPortA и MyPortB заключается в наследовании протокола.
Это ошибка в Python или предполагаемое поведение?
Да, я знаю, что эта строка нарушение атрибута только для получения, определенного в протоколе, но это проблема подсказки типа для таких инструментов, как mypy, а не для среды выполнения.
(А может быть, это даже не нарушение подсказки типа, поскольку атрибут, доступный для чтения и записи, является подтипом атрибута, доступного только для чтения).
Я ожидал увидеть никакой разницы между классами, наследующими протокол
code> и классы, которые этого не делают.
Версия Python: 3.9.7
Подробнее здесь: https://stackoverflow.com/questions/785 ... -in-python
Мобильная версия