Python collections.abc中抽象方法的用途

Python collections.abc中抽象方法的用途,python,collections,abstract-class,Python,Collections,Abstract Class,集合库提供抽象类及其子类,如MutableSequence及其超类Sequence 子类中抽象方法的必要性是什么?这些子类必须在继承自它们的类中定义。为什么不能用具体的方法来代替呢?那么具体方法的实现是什么呢 这些类的目的不是给您另一个列表对象。它们的存在是为了传达类需要实现哪些方法才能遵守给定的协议 对于集装箱ABC,它们本身不是集装箱;它们实际上什么都没有。因此,您不能为序列提供具体的\uuuu getitem\uuuu方法;没有内部状态。并且提供一个使用\u list属性的实现将指示子类应

集合库提供抽象类及其子类,如
MutableSequence
及其超类
Sequence


子类中抽象方法的必要性是什么?这些子类必须在继承自它们的类中定义。为什么不能用具体的方法来代替呢?

那么具体方法的实现是什么呢

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

对于集装箱ABC,它们本身不是集装箱;它们实际上什么都没有。因此,您不能为
序列
提供具体的
\uuuu getitem\uuuu
方法;没有内部状态。并且提供一个使用
\u list
属性的实现将指示子类应该如何实现这一点,但代理类(仅举一个例子)不会具有内部序列状态


只有可以用其他方法表示的方法,例如
\uuuuuuuuuuuu包含
(如果
\uuuuuuu getitem\uuuuuuuu
没有引发异常,则返回
True
)或
\uuuuuu iter\uuuuuuuuuuuu
(使用递增索引并生成
\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuu的结果,直到引发异常)为了方便子类化,有一个具体的实现。

那么具体方法的实现是什么呢

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

对于集装箱ABC,它们本身不是集装箱;它们实际上什么都没有。因此,您不能为
序列
提供具体的
\uuuu getitem\uuuu
方法;没有内部状态。并且提供一个使用
\u list
属性的实现将指示子类应该如何实现这一点,但代理类(仅举一个例子)不会具有内部序列状态


只有可以用其他方法表示的方法,例如
\uuuuuuuuuuuu包含
(如果
\uuuuuuu getitem\uuuuuuuu
没有引发异常,则返回
True
)或
\uuuuuu iter\uuuuuuuuuuuu
(使用递增索引并生成
\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuu的结果,直到引发异常)为了方便子类化,有一个具体的实现。

那么它们的实现是什么呢?PEP 3119中的基本原理是一个很好的信息源。那么它们的实现是什么呢?PEP 3119中的基本原理是一个很好的信息源。您是否能够将这个答案扩展到虚拟子类的目的?我的理解是,虚拟子类注册到abstractclass/超类,作为通过类型检查的一种手段,例如isinstance或issubclass-但是为什么有人想这样做,为什么不创建一个真正的子类?@Aranfleel:因为您想测试协议。实现
\uuuu getitem\uuuuuu
\uuuu len\uuuuuu
的东西可以在Python需要序列的任何地方使用。然而,这并不需要继承。您确实希望测试这些属性,因此,
isinstance(obj,Sequence)
很有价值。您是否能够将此答案扩展到虚拟子类的用途?我的理解是,虚拟子类注册到abstractclass/超类,作为通过类型检查的一种手段,例如isinstance或issubclass-但是为什么有人想这样做,为什么不创建一个真正的子类?@Aranfleel:因为您想测试协议。实现
\uuuu getitem\uuuuuu
\uuuu len\uuuuuu
的东西可以在Python需要序列的任何地方使用。然而,这并不需要继承。您确实希望测试这些属性,因此,
isinstance(obj,Sequence)
很有价值。