为什么检查cls是否是__subclasshook__中的类?

Pra*_*tic 6 python abstract-class python-3.x

Python标准库文档中,示例实现__subclasshook__是:

class MyIterable(metaclass=ABCMeta):

[...]

@classmethod
def __subclasshook__(cls, C):
    if cls is MyIterable:
        if any("__iter__" in B.__dict__ for B in C.__mro__):
            return True
    return NotImplemented
Run Code Online (Sandbox Code Playgroud)

CPython的实现collections.abc确实遵循__subclasshook__它定义的大多数成员函数的这种格式.明确检查cls参数的目的是什么?

use*_*ica 4

__subclasshook__是遗传的。该cls is MyIterable检查确保具体子类MyIterable使用常规issubclass逻辑而不是检查方法__iter__。不然的话,为了一堂课MyConcreteIterable(MyIterable),你就得issubclass(list, MyConcreteIterable)回去了True