5

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,如果是,为什么?(在这种情况下,简单优于复杂胜过显式优于隐式吗?)

4

2 回答 2

5

您可以使用任何一种方法获得相同的结果。ABC 方法的主要好处是为您提供了一些逻辑。例如,要通过鸭子类型实现 Set 类型,您必须编写和测试 14 个接口 - __contains__, __iter__, __len__, __le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__, __sub__, __xor__, and isdisjoint

但是如果你使用ABC,你只需要定义__contains__, __iter__ and __len__——ABC使用你提供的这些函数来为你实现剩下的11个方法。ABC 做你想做的事,但省力。这是一条让您到达同一个目的地的捷径。

于 2013-08-25T16:42:05.033 回答
1

对我来说,mixin 似乎是这个模块的主要部分。同样在大多数情况下,是的,简单是制作完美代码的主要目标,至少对我来说(不是我曾经管理过它)。ABC 模块的功能似乎非常清楚它们的作用,这有助于共享和浏览代码。最后,我可能错了,所以不要指望它,虽然我认为ABC的一些函数可以在一个函数中检查多个属性。

于 2013-08-25T16:26:43.550 回答