如果我定义一个协议和一个实现该协议的类,我想记录该类确实/应该实现该协议,以便其他开发人员可以轻松地看到该类应该实现该协议,以便进行静态分析工具可以验证该类是否实现了该协议。在课堂上记录这一点的正确方法是什么?
可以对协议进行子类化吗?
考虑协议:
from typing import Protocol
class MyProtocol(Protocol):
def foo() -> None:
...
这样定义一个类是否正确?:
from my_protocol import MyProtocol
class MyClass(MyProtocol):
def __init__(self):
pass
def foo() -> None:
pass
我可以使用抽象基类,但这样我就无法支持结构子类型的类,但不支持实际的派生类。
我看到这里似乎提出了这个问题的一个版本,但似乎没有实际的答案:正确的方法来暗示类正在实现协议?
我认为答案就在 PEP-0544 上:
“要显式声明某个类实现给定的协议,它可以用作常规基类。”
https://peps.python.org/pep-0544/#explicitly-declaring-implementation
我个人经常从协议中进行子类化,因为:
class DataGetter(Protocol):
def get_data(self):
...
def get(self):
warn('get method is deprecated use get_data instead', DeprecationWarning)
return self.get_data()
class Image(DataGetter):
def get_data(self):
return "some image data"