使用接口/抽象基类是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吗?的主要内容,如果未能解决你的问题,请参考以下文章