自从引入协议类以来,抽象基类是否是多余的?

Not*_*ame 12 python duck-typing

我正在学习如何使用 Python 3.8 ( PEP 544 )中引入的协议类。

因此,typing.Protocol类是 的子类,ABCMeta并且它们的处理方式就像抽象类一样,并且具有允许使用结构子类型的额外好处。我试图思考现在我会使用什么抽象基类,但我却一片空白。

与 ABC 相比,协议类有哪些缺点(如果有)?也许它们的性能会受到影响?是否有任何特定情况表明 ABC 仍然是最佳选择?

Joe*_*ley 5

我更喜欢ABCs 因为它们很明确。阅读代码的人Protocol可能不知道您的类旨在实现另一个模块中的接口或深度依赖项。同样,您可能会意外地遵守 aProtocol的签名,而不遵守其合同。例如,如果一个函数接受一个

class Image(Protocol):
    def draw() -> None:
        ...
Run Code Online (Sandbox Code Playgroud)

显然没有意义

class Cowboy:
    def draw() -> None:
         ...
Run Code Online (Sandbox Code Playgroud)

但类型检查器会很乐意接受它。