2017-04-08 15 views
0

集合库提供抽象类及其子类,如MutableSequence及其超类Sequencecollections.abc中抽象方法的用途

在子类中抽象方法的必要性是什么,然后被强制定义在从它们继承的类中。为什么不能使用具体的方法呢?

+1

那么他们的实施是什么? –

+0

PEP 3119中的基本原理是一个很好的信息源。 – VPfB

回答

1

那么具体方法的执行方式是

这些类的要点是而不是给你另一个列表对象。它们的存在是为了传达一个类需要实现哪些方法来遵守给定的协议。

对于容器ABC,它们本身不是容器;他们实际上没有任何东西。所以你不能提供Sequence的具体__getitem__方法; 没有内部状态。并且提供一个使用_list属性的实现将决定子类如何实现这一点,但代理类仅仅是一个例子,它不会有内部的序列状态。

,可以在其他的方法来表达,如__contains__True如果__getitem__没有引发异常)或__iter__只有方法,使用越来越指数和生产的__getitem__结果直到抛出例外)具有子类化便利性的具体实现。

+0

你能否将这个答案扩展到虚拟子类的目的?我的理解是虚拟子类被注册到abstractclass/superclass作为传递类型检查的方式,例如isinstance或issubclass - 但为什么有人想要这样做,为什么不创建一个真正的子类呢? –

+1

@AranFreel:因为你想测试*协议*。实现'__getitem__'和'__len__'的任何东西都可以在Python预期序列的任何地方使用。然而,这并不需要继承。你*想要测试这些属性,所以'isinstance(obj,Sequence)'是有价值的。 –