如何注释Python类应该实现协议?

问题描述 投票:0回答:1

如果我定义一个协议和一个实现该协议的类,我想记录该类确实/应该实现该协议,以便其他开发人员可以轻松地看到该类应该实现该协议,以便进行静态分析工具可以验证该类是否实现了该协议。在课堂上记录这一点的正确方法是什么?

可以对协议进行子类化吗?

考虑协议:

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

我可以使用抽象基类,但这样我就无法支持结构子类型的类,但不支持实际的派生类。

我看到这里似乎提出了这个问题的一个版本,但似乎没有实际的答案:正确的方法来暗示类正在实现协议?

python protocols
1个回答
0
投票

我认为答案就在 PEP-0544 上:

“要显式声明某个类实现给定的协议,它可以用作常规基类。”

https://peps.python.org/pep-0544/#explicitly-declaring-implementation

我个人经常从协议中进行子类化,因为:

  • 当我键入方法签名时,我的 IDE 能够自动完成方法签名(协议中定义的签名)
  • 如果我从协议重命名所有方法类,我的 IDE 可以重命名它们
  • 我可以在 Protocol 类中实现已弃用的方法(调用另一个方法),而不是在所有子类中实现:
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"

© www.soinside.com 2019 - 2024. All rights reserved.