【发布时间】:2019-09-23 15:50:20
【问题描述】:
我使用的是 3.6.3 版
我正在研究Pythoncollections.abc的类间继承关系。我在list、Sequence和Hashable之间发现了一些矛盾的继承关系
如您所知,
1、Sequence继承Hashable类和
2. list继承Sequence
from collections import Sequence, Hashable
issubclass(Sequence, Hashable) # 1.
issubclass(list, Sequence) # 2.
True
True
由此,您可能会认为 list 在概念上也继承了 Hashable。
但是 list 是可变的,它不会继承 Hashable(意味着'你不能'hash(some_list)')
issubclass(list, Hashable)
False
我认为这种继承是矛盾的。我完全理解list 是可变的,因为我已经使用了数百次list,但是继承关系图不支持这个概念。我错了什么或遗漏了什么?
我等待您的建议。谢谢。
【问题讨论】:
-
你看过这个博客吗:naftaliharris.com/blog/python-subclass-intransitivity?它看起来很不错,这里引用了一句,“...Iterable 是 Hashable 的“子类”——说真的,因为 Iterable 具有从对象继承的
__hash__方法”。 -
Sequence有一个__hash__方法,但是根据docs.python.org/3.6/library/…,Sequence不继承自Hashable。 (不是答案,只是观察。) -
@SuperShoot 感谢您的参考。我非常喜欢这种方法:在 Python 中获取所有类并测试所有三元组依赖项检查。我想我应该稍后再深入研究
metaclass。 :) -
我也将那本书添加到我的阅读清单中。感谢您的出色 Q 并祝您在 Python 学习中一切顺利。