我收到了一个错误地继承了抽象基类的类的代码collections.Iterator。它不遵循迭代器契约,这种有缺陷的继承关系会导致下游问题。有没有办法注销抽象基类?
注意:我知道这是一个奇怪的情况。请避免对 Monkey Patching 发表意见的冲动。
您的选择不是从该类继承,而是提供您自己的正确和适当的next方法,或者提供从该方法返回的替代迭代器__iter__。
isinstance(instance, collections.Iterator)除了is之外,这里不涉及任何注册True,并且返回True有两个原因:
collections.Iterator该类;它是一个直接子类。__iter__和next方法;任何实现这两种方法的类都将注册为collections.Iterator.基collections.Iterator类提供一个abstractmethod next, 和一个具体__iter__方法(它返回self)。如果您的子类没有实现他们自己的版本,next那么创建该类的实例将不起作用;aTypeError被提出抱怨这next是一种抽象方法。
如果该类不是迭代器,那么您的第一个选择是更改原始类不继承 fro collections.Iterator。
下一个选项是提供一个固定的next()方法;它要求您的实例在每次调用时保持状态以帮助生成下一个值,或者StopIterator在没有更多新值要生成时引发。
您的第三个选择是从该方法返回一个适当的迭代器__iter__。self您可以返回一个在实例上实现迭代的新对象,而不是返回。