Должен ли протокол с @property изменить поведение времени выполнения в Python?Python

Программы на Python
Ответить
Anonymous
 Должен ли протокол с @property изменить поведение времени выполнения в Python?

Сообщение Anonymous »

Я думал, что протокол Python полезен только для подсказок типов, без какого-либо влияния на поведение во время выполнения (кроме случаев использования @runtime_checkable или реализации метода по умолчанию).
Но посмотрите на этот пример:

Код: Выделить всё

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)
Где строка my_port_b.port_id = "some_id" вызывает AttributeError: невозможно установить атрибут.
Единственный Разница между MyPortA и MyPortB заключается в наследовании протокола.

Это ошибка в Python или предполагаемое поведение?
Да, я знаю, что эта строка нарушение атрибута только для получения, определенного в протоколе, но это проблема подсказки типа для таких инструментов, как mypy, а не для среды выполнения.
(А может быть, это даже не нарушение подсказки типа, поскольку атрибут, доступный для чтения и записи, является подтипом атрибута, доступного только для чтения).
Я ожидал увидеть никакой разницы между классами, наследующими протокол
code> и классы, которые этого не делают.
Версия Python: 3.9.7

Подробнее здесь: https://stackoverflow.com/questions/785 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»