我正在尝试理解collections.abc
源代码。
让我们看一下Hashable
类的__subclasshook__
实现:
@classmethod
def __subclasshook__(cls, C):
if cls is Hashable:
for B in C.__mro__:
if "__hash__" in B.__dict__:
if B.__dict__["__hash__"]:
return True
break
return NotImplemented
在这里,我们首先检查是否有属性hash
,然后检查它是否具有非假值。这个逻辑也在Awaitable
课堂上呈现。
和AsyncIterable
类' __subclasshook__
:
@classmethod
def __subclasshook__(cls, C):
if cls is AsyncIterable:
if any("__aiter__" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented
在这里,我们只检查是否有__aiter___
属性,并且此逻辑在此包中的任何其他类中都存在。
这种逻辑差异有什么原因吗?