0

我收到了一个错误地继承了抽象基类的类的代码collections.Iterator。它不遵循迭代器契约,这种有缺陷的继承关系会导致下游问题。有没有办法注销抽象基类?

注意:我知道这是一个奇怪的情况。请避免对 Monkey Patching 发表意见的冲动。

4

1 回答 1

1

您的选择不是从该类继承,而是提供您自己的正确和适当的next方法,或者提供从该方法返回的替代迭代器__iter__

isinstance(instance, collections.Iterator)除了is之外,这里不涉及任何注册True,并且返回True有两个原因:

  1. 你的类继承自collections.Iterator该类;它是一个直接子类。
  2. 你的班级有__iter__next方法;任何实现这两种方法的类都将注册为collections.Iterator.

collections.Iterator类提供一个abstractmethod next, 和一个具体__iter__方法(它返回self)。如果您的子类没有实现他们自己的版本,next那么创建该类的实例将不起作用;aTypeError被提出抱怨这next是一种抽象方法。

如果该类不是迭代器,那么您的第一个选择是更改原始类不继承 fro collections.Iterator

下一个选项是提供一个固定的next()方法;它要求您的实例在每次调用时保持状态以帮助生成下一个值,或者StopIterator在没有更多新值要生成时引发。

您的第三个选择是从该方法返回一个适当的迭代器__iter__self您可以返回一个在实例上实现迭代的对象,而不是返回。

于 2014-08-01T17:46:09.097 回答