Python 为什么要检查cls是否是子类钩子中的类?

Python 为什么要检查cls是否是子类钩子中的类?,python,python-3.x,abstract-class,Python,Python 3.x,Abstract Class,在中,\uuuuuu子类hook\uuuu的示例实现为: 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 NotImplemen

在中,
\uuuuuu子类hook\uuuu
的示例实现为:

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
CPython对
collections.abc
的实现实际上在它定义的大多数
\uuuuu子类hook\uuuuu
成员函数中都遵循这种格式。
显式检查
cls
参数的目的是什么?

\uuuu子类hook\uuuu
是继承的。
cls是MyIterable
检查确保了
MyIterable
的具体子类使用常规的
issubclass
逻辑,而不是检查
\uuuuuuu iter\uuu
方法。否则,对于类
myconcreteerable(MyIterable)
,您需要
issubclass(list,myconcreteerable)
返回
True

以确保这一释义正确吗?
cls
不是类的最有可能的情况是,派生自ABC的类如果不提供抽象方法的实现,就无法创建自身的实例,因此,在这种情况下,
\uuu subclasshook\uuuu
没有理由检查方法。@praxeotic:no.如果您有一个类
myconcreteable
子类化
MyIterable
,并且
cls is MyIterable
检查不存在,那么
issubclass(list,myconcreteable)
将返回
True