【发布时间】:2016-07-09 14:10:10
【问题描述】:
我正在尝试理解collections.abc 源代码。
我们来看看Hashableclass'__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___属性,并且这个逻辑在这个包中的任何其他类中都有。
这种逻辑差异有什么原因吗?
【问题讨论】:
标签: python python-3.x abc