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
。