list 是object的子类, object是Hashable的子类, 子类关系应该是可以传递的, 为什么list不是Hashable的子类?
Python 中的子类关系并不一定是传递的. 任何人都可以在元类中随意定义 __subclasscheck__
a. 元类可以简称为类的类 b. type是Python的一个内建元类,用来直接控制生成类 c. 在python当中任何class定义的类其实都是type类实例化的结果 d. 只有继承了type类才能称之为一个元类,否则就是一个普通的自定义类, 自定义元类可以控制类的产生过程,类的产生过程其实就是元类的调用过程 class A(type): def __subclasscheck__(self, subclass): print('invoke __subclasscheck__') return True def __hash__(self): print('__hash__') class B(metaclass=A): pass print(issubclass(list, B)) >invoke __subclasscheck__ >True当issubclass(cls, Hashable) 被调用时, 它只是在 cls 中寻找__hash__方法或者从继承的父类中寻找__hash__方法
由于 object 是可散列的(hashable), 但是list是不可散列的, 所以它打破了这种传递关系