以下是如何使用Python docs中的__subclasshook__
:
@classmethod
def __subclasshook__(cls, C):
if cls is MyIterable:
if any("__iter__" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented
有人已经问why the "if cls" check is necessary,但还有一件事我不明白。为什么要明确查看__dict__
中的每个__mro__
?不能说if hasattr(C, '__iter__')
吗?我用一个玩具示例尝试了后者,它按照我的预期工作,但我想知道是否存在一些细微差别,或者文档中的样式是否因为“历史原因”而存在。