抽象基础类与鸭子打字

时间:2013-08-25 16:08:35

标签: python idioms duck-typing

Python具有特定的ABCs for container types。它说它们是“,......用于测试一个类是否提供特定的接口。” (而且它们对于某些混音也很有用,但暂时忽略它。)

我无法弄清楚为什么这些ABCs真的有用。也许我的问题只是文档中的例子过于学术化,但使用这些例子:

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

2 个答案:

答案 0 :(得分:3)

使用任何一种方法都可以获得相同的结果。 ABC方法的主要好处是为您提供了一些逻辑。例如,要通过duck typing实现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做你想做的事情,但努力程度较低。这是一条让你到达同一目的地的捷径。

答案 1 :(得分:1)

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