除了文档目的之外,我在它们中找不到太多的优势。如果我忘记实现我在ABC中定义的方法,Python会警告我,但由于我不通过它们的接口引用我的对象,我可能忘记在它们的接口中声明方法,我不会注意到它。 通常的做法是使用ABC来实现类似接口的行为吗?
答案 0 :(得分:6)
就个人而言,我发现抽象类在编写一个开发人员与另一个开发人员之间的接口的库或其他代码时最有用。
静态类型语言的一个优点是,当您使用错误的类型时,它会提前失败(通常,早在编译时)。 ABCs允许Python通过动态类型获得同样的优势。
如果您的库代码鸭子类型缺少一个重要方法的对象,它可能不会失败,直到需要该方法(这可能需要很长时间或将资源置于不一致状态,具体取决于它的使用方式)。但是,对于ABCs,丢失的方法要么不使用正确的ABC(并且未通过instanceof
检查),要么被ABC“验证”。
此外,ABCs是一种很好的文档接口方式,无论是在概念上还是通过文档字符串,都是字面上的。
答案 1 :(得分:1)
AFAIK,标准做法是对未实现的抽象方法使用NotImplementedError
异常。
但我相信ABC可能被认为是pythonic,因为它现在是part of the Python standard library。