1

我正在尝试理解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___属性,并且此逻辑在此包中的任何其他类中都存在。

这种逻辑差异有什么原因吗?

4

1 回答 1

3

__hash__协议明确允许通过设置将类标记为不可散列__hash__ = None

如果一个类 [...] 希望抑制散列支持,它应该包含__hash__ = None在类定义中。

原因是a == b总是需要hash(a) == hash(b). 否则,dictset类似的数据结构会中断。如果子类__eq__显式或以其他方式更改,则可能不再适用。因此,__hash__可以标记为不适用。

于 2016-07-09T15:12:45.593 回答