Python 术语:接口与协议

Posted

技术标签:

【中文标题】Python 术语:接口与协议【英文标题】:Python terminology: interface vs. protocol 【发布时间】:2021-07-17 21:11:28 【问题描述】:

有人能解释一下 Python 编程上下文中术语 protocolinterface 之间的区别吗?

我在 buffer protocol 和 PEP 544 之类的东西中看到了对“协议”一词的引用,但我想确保我理解这个词的含义,以及何时何地,你会以不同的方式使用它来自“接口”的一般概念。

【问题讨论】:

"...which other languages may term interface or trait." @jonrsharpe 请注意该页面在使用协议与接口时如何摇摆不定,并且在某些地方可以互换使用它们。它们是 Python 上下文中的同义词,还是协议有一些额外的(隐含的)特征等? 我推荐阅读 Luciano RamalhoFluent Python 一书的 Interfaces and Protocols in Python Culture 以获得完整的了解python中协议和接口的区别。 @FrancoMorero 我会接受一个答案,您提供了一些(最小)在那里描述的差异概述,然后说细节在那本书中。 这是另一个有用的链接:masnun.rocks/2017/04/15/interfaces-in-python-protocols-and-abcs。简而言之,我会说协议是一个“非正式接口”,它定义了一个类如何交互,但不是语言语法的一部分。可以通过定义要实现的接口方法的抽象基类来实现更“正式的接口”。该页面上的更多详细信息。 【参考方案1】:

在我试图回答这个问题之前,回顾一下接口的定义:

接口包含非抽象类或结构必须实现的一组相关功能的定义。

来源:Microsoft Docs

接口用于静态类型语言来描述两个独立的对象“实现相同的行为”。接口在代码中正式声明并由编译器强制执行(因此 must 在上面的接口定义中)。它们是告诉类型系统两个对象理论上可以相互替换的一种方式(因此在某种程度上是相关的)。另一种方式是继承。如果不能,编译器会抛出错误。

与此相反,像 Python 这样的动态类型语言不需要像接口或继承这样的机制来检查两个对象是否相关。他们使用鸭子类型,其中搜索对象的适当函数/方法是在运行时推导出来的。如果找到,则执行 - 如果没有,则抛出错误。因此,不需要接口。相反,有所谓的“特殊方法”可以由类实现,以赋予实例某些“特征”,例如它们可以通过实现__eq____hash__ 方法进行散列。这些非正式接口不是由编译器强制执行的,只存在于文档中。

举个这些非正式接口的例子,想象一下偶然发现一些代码,它实现了一个行为像一个列表的自定义类。尽管在代码中没有任何地方此类与任何抽象序列类相关,但您知道它用于生成类似序列的对象,因为它实现了__len____getitem__ 特殊方法。

我认为协议是不那么严格的接口版本,因为它们不是强制执行的,也不是所有的协议都必须由一个类来实现。如果您只是希望该类是可迭代的,您可以选择并实现您必须实现的特殊方法,而其余的保持不变。

话虽如此,您可以通过使用抽象基类 (ABC) 来模拟类似接口的行为。

【讨论】:

以上是关于Python 术语:接口与协议的主要内容,如果未能解决你的问题,请参考以下文章

python接口自动化测试一:http协议

python接口自动化测试一:http协议

python自动化接口自动化:1.接口测试基础

用啥来替换python中的接口/协议

Java原生网络编程

Python 接口:从协议到抽象基类