Python对容器类型有特定的 ABC。它说它们是,“……用于测试一个类是否提供特定的接口。” (而且它们对某些 mixin 也很有用,但我们暂时忽略它。)
我很难弄清楚为什么其中一些 ABC 真的很有用。也许我的问题只是文档中的示例过于学术,但使用这些示例:
# Verbatim
size = None
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)
# Is that so much better than
size = None
if hasattr(myvar, '__len__'):
size = len(myvar)
在第二种情况下,您避免了导入,并且代码对我来说似乎更明确。您可以从其名称中推断出 collections.abc.Sized 的含义,或者查找它,但它并不像“如果它有长度,则获取它的长度”那样明确。
集合类型测试的 abc 方法真的比显式hasattr
测试更惯用 Python,如果是,为什么?(在这种情况下,简单优于复杂胜过显式优于隐式吗?)