使用接口/抽象基类在Python中是否符合习惯?
我觉得使用抽象基类(ABC)除了作为一种文档说明之外,没有太多好处。比如说,如果我忘记实现一个我在抽象基类里定义的方法,Python会给我警告。但是因为我不通过接口来引用我的对象,所以我可能会忘记在接口里声明方法,而我甚至不会注意到这一点。大家通常会用抽象基类来模拟接口的行为吗?
2 个回答
1
据我所知,通常的做法是使用 NotImplementedError
这个错误来表示某些抽象方法还没有实现。
不过我觉得 ABC 可能被认为是符合 Python 风格的,因为它现在已经是 Python 标准库的一部分 了。
6
我个人觉得抽象类在写库或者其他需要不同开发者之间交流的代码时特别有用。
静态类型语言的一个好处是,当你使用了错误的类型时,它会很早就报错(通常是在编译的时候就能发现)。抽象基类(ABCs)让Python在动态类型的情况下也能享受到这个好处。
如果你的库代码在使用一个缺少重要方法的对象时,可能要等到真正需要这个方法的时候才会出错(这可能会花费很多时间,或者让资源处于不一致的状态,具体取决于怎么使用)。但是使用抽象基类后,如果缺少方法,要么就是没有使用正确的抽象基类(这样会在instanceof
检查时失败),要么就是通过抽象基类进行了“验证”。
此外,抽象基类也是一个很好的文档工具,可以帮助你清晰地描述接口,不仅在概念上,而且通过文档字符串(docstrings)也能做到这一点。