使用接口/抽象基类是pythonic吗?

Posted

技术标签:

【中文标题】使用接口/抽象基类是pythonic吗?【英文标题】:Is it pythonic to use interfaces / abstract base classes? 【发布时间】:2011-07-14 03:06:22 【问题描述】:

除了文档目的之外,我在它们中找不到太多优势。如果我忘记实现我在 ABC 中定义的方法,Python 会警告我,但由于我没有通过它们的接口引用我的对象,我可能会忘记在它们的接口中声明方法并且我不会注意到它。 将 ABC 用于类似界面的行为是常见的做法吗?

【问题讨论】:

【参考方案1】:

就个人而言,我发现抽象类在编写库或其他开发人员之间接口的代码时最有用。

静态类型语言的优点之一是,当您使用错误的类型时,它会提前失败(通常早在编译时)。 ABC 允许 Python 通过动态类型获得同样的优势。

如果您的库代码鸭子类型的对象缺少重要的方法,它可能不会失败,直到需要该方法(这可能会花费大量时间或将资源置于不一致的状态,具体取决于它的使用方式)。但是,对于 ABC,缺少的方法要么没有使用正确的 ABC(并且未通过 instanceof 检查),要么被 ABC“验证”。

此外,ABC 是记录接口的绝佳方式,无论是在概念上还是通过文档字符串,在字面上。

【讨论】:

【参考方案2】:

AFAIK,标准做法是对未实现的抽象方法使用 NotImplementedError 异常。

但我相信 ABC 可能被认为是 pythonic,因为它现在是 part of the Python standard library。

【讨论】:

以上是关于使用接口/抽象基类是pythonic吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python3.7之抽象类与归一化

初学Python——面向对象

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

抽象基类实现

python之协议到抽象基类3

python的接口和抽象类