2013-08-25 85 views
3

Python有特定的ABCs for container types。它说,他们是,“...用于测试一个班级是否提供特定的界面。” (并且它们对于一些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方法集合类型测试真的比惯用的Python更明确hasattr测试,如果是这样,为什么? (是否简单比复杂王牌不是在这种情况下隐含更好明确的是更好吗?)

+1

[ABC vs Alternatives](http://www.python.org/dev/peps/pep-3119/#abcs-vs-alternatives) – dawg

回答

1

对我来说,混入似乎是这个模块的主要部分。 同样在大多数情况下,最简单的做法是完成代码的主要目标,至少对我来说(并非我曾经管理它)。事实上,ABC模块的功能似乎很清楚他们的工作,有助于共享和浏览代码。 最后,我可能错了,所以不要指望它,尽管我认为ABC的一些函数可以在一个函数中检查多个属性。

3

您可以使用这两种方法获得相同的结果。 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种方法。美国广播公司做你会做的,但更少的努力。这是将您带到相同目的地的捷径。